我运行了一个模拟,它将一个巨大的文件写入磁盘。该文件是一个大矩阵v
。我无法全部阅读,但我真的只需要一部分矩阵,比如1:100的列和行。我想做像
vtag = dlmread('v',1:100:end, 1:100:end);
当然,这不起作用。我知道在写入文件
时我应该只完成以下操作dlmwrite('vtag',v(1:100:end, 1:100:end));
但我没有,再次运行一切还需要两天时间。
谢谢
阿米尔
答案 0 :(得分:3)
值得庆幸的是,dlmread
功能支持指定范围为the third input。因此,如果您想要读取前100行的所有N
列,可以使用以下命令指定
startRow = 1;
startColumn = 1;
endRow = 100;
endColumn = N;
rng = [startRow, startColumn, endRow, endColumn] - 1;
vtag = dlmread(filename, ',', rng);
编辑根据您的澄清
由于您不想要1:100
行而是1:100:end
行,因此以下方法应该更适合您。
您可以使用textscan
一次读取数据块。你可以读一个好的"行然后读入下一个" chunk"要忽略的数据(在此过程中丢弃它),并继续直到到达文件末尾。
下面的代码略微修改了这个想法,除了它使用textscan
输入到rows2skip
,它指示函数在读入数据之前要忽略多少行。第一次通过循环时,不会跳过任何行,但是通过循环的所有其他时间将跳过startRow = 1;
rows2skip = 99;
columns = 3000;
fid = fopen(filename, 'rb');
% For now, we'll just assume you're reading in floating-point numbers
format = repmat('%f ', [1 columns]);
count = 1;
lines2discard = startRow - 1;
while ~feof(fid)
% Use "HeaderLines" to skip data before reading in data we care about
row = textscan(fid, format, 1, 'Delimiter', ',', 'HeaderLines', lines2discard);
data{count} = [row{:}];
% After the first time through, set the "HeaderLines" (i.e. lines to ignore)
% to be the # we want to skip between lines (much faster than alternatives!)
lines2discard = rows2skip;
count = count + 1;
end
fclose(fid);
data = cat(1, data{:});
行。这使我们能够跳跃"通过文件非常快速地不需要调用任何额外的文件操作。
a*v
您可能需要针对自己的输入类型调整HeaderLines
。