我有类似的东西:
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栏:编号
第二栏:模式
第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)
你能告诉我怎么解决这个问题吗?
答案 0 :(得分: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
)。
然而,这太麻烦而且不通用。请考虑使用强大的textscan
命令,而不是for循环和fscanf
,如@fpe建议:
C = textscan(FID5, '%d', 11);
row_no = cell2mat(C(2));
mode = cell2mat(C(2));
point = cell2mat(C(3:end));
答案 1 :(得分:0)
你不能这样做:
format = repmat('%d',1,11);
fid = fopen(filename,'r');
A = textscan(fid,format,'Delimiter','\n');