0

我有类似的东西:

1  1  1 2 3 10 17 16 15 8 9 
2  1  3 4 5 12 19 18 17 10 11
3  1  5 6 7 4 21 20 19 12 13
4  1  15 16 17 24 31 30 29 22 23

第 1 列:数字
第 2 列:模式
第 3-12 列:点

我写了这个fscan格式。

for no=1:4    
    no=fscanf(FID5, '%d', 1);
    mode=fscanf(FID5, '%d', 1);
    point=fscanf(FID5, '%d  %d  %d  %d  %d  %d  %d  %d  %d',[9,1]);

    fprintf(FID6, '%-2d           %-2d        %-2d  %-2d  %-2d  %-2d  %-2d  %-2d  %-2d  %-2d  %-2d\n',no,mode,point); 

end

我预计:

point=size(no,9)

但我得到了

point=size(1,9)

你能告诉我如何解决这个问题吗?

4

2 回答 2

2

您的解决方案中的问题

让我们尝试修复您当前的解决方案:主要问题是您在每次迭代中只读取一行值points,覆盖之前存储在其中的任何内容。尝试像这样修改您的代码:

point = zeros(4, 9);  %// Add this line to preallocate memory for 'point'
for no = 1:4

    %// ...
    point(no, :) = fscanf(FID5, '%d  %d  %d  %d  %d  %d  %d  %d  %d',[9,1]);
    %// ...
end

你在fscanf循环内阅读的所有其他内容也是如此。在循环之前为您读取的数据预分配一个数组,并在每次迭代中将其读入不同的行。

此外,您的代码中还有另一个严重错误:

no=fscanf(FID5, '%d', 1);  %// BAD! no' is used as the loop iteration variable

您在循环no内使用循环变量来存储您读取的数据。这是绝对的禁忌!您应该将数据读入另一个变量(例如,row_no)。

有更好的解决方案吗?

但是,这太麻烦且不通用。代替 for 循环 and fscanf,考虑使用强大的textscan命令,如@fpe 建议的:

C = textscan(FID5, '%d', 11);
row_no = cell2mat(C(2));
mode = cell2mat(C(2));
point = cell2mat(C(3:end));
于 2013-05-09T08:24:16.493 回答
0

你不能这样做:

format = repmat('%d',1,11);
fid = fopen(filename,'r');
A = textscan(fid,format,'Delimiter','\n');
于 2013-05-09T08:00:49.003 回答