我運行了一個模擬,它將大文件寫入磁盤。該文件是一個大矩陣v
。我無法全部閱讀,但我真的只需要矩陣的一部分,比如1:100的列和行。我想要做類似如何在Matlab中稀疏讀取大文件?
vtag = dlmread('v',1:100:end, 1:100:end);
當然,這是行不通的。我知道我應該寫的時候文件
dlmwrite('vtag',v(1:100:end, 1:100:end));
但是我沒有,並再次運行一切將需要兩天只是做了以下內容。
由於
阿米爾
我運行了一個模擬,它將大文件寫入磁盤。該文件是一個大矩陣v
。我無法全部閱讀,但我真的只需要矩陣的一部分,比如1:100的列和行。我想要做類似如何在Matlab中稀疏讀取大文件?
vtag = dlmread('v',1:100:end, 1:100:end);
當然,這是行不通的。我知道我應該寫的時候文件
dlmwrite('vtag',v(1:100:end, 1:100:end));
但是我沒有,並再次運行一切將需要兩天只是做了以下內容。
由於
阿米爾
值得慶幸的dlmread
功能支持指定範圍改爲the third input。所以,如果你婉閱讀所有N
列第100行,您可以根據您的澄清
既然你不想1:100
行指定用下面的命令
startRow = 1;
startColumn = 1;
endRow = 100;
endColumn = N;
rng = [startRow, startColumn, endRow, endColumn] - 1;
vtag = dlmread(filename, ',', rng);
編輯,但而是1:100:end
行,以下方法應該對你更好。可以使用textscan
一次讀取數據塊。您可以讀取一個「良好」行,然後讀取要忽略的下一個「大塊」數據(在過程中將其丟棄),然後繼續操作,直至到達文件末尾。
下面的代碼略微修改了這個想法,只是它使用HeaderLines
輸入到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{:});
您可能需要爲自己的輸入類型調整format specifier。
嗨,我很抱歉,但這不是我想要做的。我想跳過每100行,而不是讀取前100行。 –
@CuriousMe答案已經更新,適用於您需要的方法。 – Suever
您沒有選擇,只能手動解析文件並自行跳過每100行。你能告訴我們矩陣的樣子嗎?這個矩陣有多少行和列? – rayryeng
它是6000 * 3000,每個條目都是14位數字。 –
看起來像Suever打敗了我。檢查他的答案。 – rayryeng