2016-03-07 63 views
1

我運行了一個模擬,它將大文件寫入磁盤。該文件是一個大矩陣v。我無法全部閱讀,但我真的只需要矩陣的一部分,比如1:100的列和行。我想要做類似如何在Matlab中稀疏讀取大文件?

vtag = dlmread('v',1:100:end, 1:100:end); 

當然,這是行不通的。我知道我應該寫的時候文件

dlmwrite('vtag',v(1:100:end, 1:100:end)); 

但是我沒有,並再次運行一切將需要兩天只是做了以下內容。

由於

阿米爾

+0

您沒有選擇,只能手動解析文件並自行跳過每100行。你能告訴我們矩陣的樣子嗎?這個矩陣有多少行和列? – rayryeng

+0

它是6000 * 3000,每個條目都是14位數字。 –

+0

看起來像Suever打敗了我。檢查他的答案。 – rayryeng

回答

3

值得慶幸的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

+0

嗨,我很抱歉,但這不是我想要做的。我想跳過每100行,而不是讀取前100行。 –

+0

@CuriousMe答案已經更新,適用於您需要的方法。 – Suever