如何在文件上专门对数组进行fprintf

时间:2019-07-06 02:18:34

标签: matlab

比如说我们有这个数组:

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 个答案:

答案 0 :(得分:3)

fprintf函数首先以的方式读取输入变量,并将每个值发送到字符串中的相应位置。因此,在您的代码中发生的事情是,即使您在代码中为每个%.4f指定了两个不同的向量,Matlab也会忽略该顺序。它将coord(:, 1)的第一个值放在第一个%.4f中,将第二个coord(:, 1)的值放在第二个%.4f中。然后它打破了界限。然后,它再次从coord(:, 1)中提取第三个值,并将其放在第一个%.4f中,依此类推。仅当第一个向量的所有值都用完时,才会从coord(:, 2)中选择值。

最简单的解决方法是转置coord矩阵,然后像这样将其输入到Matlab:

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

编辑:

要获得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的索引和x的值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