Как конкретно fprintf массив на файл - PullRequest
1 голос
/ 06 июля 2019

Допустим, например, у нас есть этот массив:

x =

    0.5920    0.4635
    0.6451    0.2118
   -0.1206   -0.6036
    0.2417    0.4773
    0.3029    0.5172

Какой код мне нужно написать, чтобы напечатать таким образом, чтобы он выглядел так:

    coords
    x1 0.5920    y1 0.4635
    x2 0.6451    y2 0.2118
    x3 -0.1206   y3 -0.6036
    x4 0.2417    y4 0.4773
    x5 0.3029    y5 0.5172

Я пробовал это:

x = gallery('uniformdata',[1,10],0);
y = gallery('uniformdata',[1,10],1);


[v,c] = voronoin([x(:) y(:)]); %returns an array V with vertices and a cell array C with a matrix for each cell of the diagram. 
c
for k = 1 : numel(c)
     c{k} = c{k}(c{k} ~= 1)
end

fileID = fopen('cords.txt' , 'w');
    for i=1:10
        coord = v(c{i},:);
        fprintf(fileID,'shape %d:\nx \t y\n', i);
        fprintf(fileID,'%.4f %.4f\n', coord(:,1), coord(:,2));

    end
    fclose(fileID);

но я получаю вывод, подобный этому:

shape 10:
x    y
0.5920 0.6451 %notice how the .6451 is on the right side when it should be on the bottom
-0.1206 0.2417
0.3029 0.4635
0.2118 -0.6036
0.4773 0.5172

1 Ответ

3 голосов
/ 06 июля 2019

Функция fprintf сначала читает входные переменные в столбце и отправляет каждое значение в соответствующее место в строке. Итак, в вашем коде происходит то, что даже когда вы указываете два разных вектора на %.4f в вашем коде, Matlab игнорирует этот порядок. В первом %.4f ставится первое значение coord(:, 1), а во втором %.4f - второе значение coord(:, 1). Тогда это нарушает черту. Затем он снова выбирает третье значение из coord(:, 1) и помещает его в первое %.4f и так далее. Он выбирает значения из coord(:, 2) только когда все значения первого вектора исчерпаны.

Самое простое решение - это транспонировать матрицу coord и затем вводить ее в Matlab следующим образом:

fprintf(fileID,'%.4f %.4f\n', coord.'); % .' tranposes the matrix

Edit:

Чтобы получить формат как x1 0.5920 y1 0.4635, мы можем использовать первый порядок столбцов, который следует Matlab для доступа к переменной

% First we make a new matrix that has each of the required elements for the desired format
% The index of x, the value of x, the index of y and the value of y
tempCoord = [1:size(coord, 1); coord(:, 1).'; 1:size(coord, 1); coord(:, 2).'];
% Now we change the string specification for fprintf
fprintf(fileID,'x%d %.4f y%d %.4f\n', tempCoord);

Почему это работает?

Если вы посмотрите на tempCoord, вы увидите, что каждый из его столбцов имеет формат, необходимый для спецификатора строки, т. Е. Индекс x, значение x, индекс y и значение y

tempCoord =
   1.000000000000000   2.000000000000000   3.000000000000000   4.000000000000000   5.000000000000000
   0.592000000000000   0.645100000000000  -0.120600000000000   0.241700000000000   0.302900000000000
   1.000000000000000   2.000000000000000   3.000000000000000   4.000000000000000   5.000000000000000
   0.463500000000000   0.211800000000000  -0.603600000000000   0.477300000000000   0.517200000000000

Теперь каждый столбец становится каждой строкой напечатанного файла, и вы получаете следующий вывод:

x1 0.5920 y1 0.4635
x2 0.6451 y2 0.2118
x3 -0.1206 y3 -0.6036
x4 0.2417 y4 0.4773
x5 0.3029 y5 0.5172
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...