2012-03-01 64 views
0

我試圖從.txt文件讀取數據。樣本數據如下。我需要一種算法來讀取M-N行號。雖然我可以使用while/for循環,但恐怕它可能會變得非常慢。謝謝!從txt文件(MATLAB)中讀取'm-to-n'行號

a=[ 1 6 11 16 ; 
    2 7 12 17 ; 
    3 8 13 18 ; 
    4 9 14 19 ; 
    5 10 15 20] ; % data is in Test.txt --> 
         % fid = fopen('Test.txt'); 
         % a=a.'; fprintf(fid, '%.3f\t%.3f\t%.3f\t%.3f\r\n', a(:)) ; 

fid = fopen('Test.txt') ; 
AnsMat = fscanf(fid, '%f %f %f %f') 

AnsMat = [2 7 12 17 ; 3 8 13 18] ; % Read row-numbers 2 to 4 this time 

回答

3

你可以嘗試textscan它允許HeaderLines參數告訴MATLAB多少行跳過。

例如讀取線N(= 2),以M(= 4),則可以這樣做:

fid = fopen('Test.txt'); 
C = textscan(fid,'%f %f %f %f\n',m-n+1,'HeaderLines',n-1); 
fclose(fid); 

這並返回該數據作爲一個單元陣列雖然所以你必須將其轉換:

AnsMat = cell2mat(C); 
+0

嗨。謝謝,但這是行不通的,因爲'm-n + 1'明智地提取數據列而不是明智的。重要的是我可以按行獲取數據。你能否建議另一種方法,或者刪除這個解決方案? – Maddy 2012-03-01 04:13:12

+0

然後你可以給出一些上下文來說明爲什麼數據必須是行式的嗎?使用'cell2mat'會將你的數據轉換成矩陣,之後你可以應用行方式的操作。如果你一次只讀一行(比如說它是一個循環),那麼你第一次只用一行代碼來讀一行,而用'n-1'和'1'代替'm-n + 1 ',在隨後的循環中,您可以使用'fscanf'(因爲文件句柄現在指向您感興趣的行,所以不需要再跳過)。 – 2012-03-01 04:16:41

+0

哎呀!抱歉!我做了一個='。'所以我正在驗證它是錯誤的。非常感謝。這正是我需要的! – Maddy 2012-03-01 04:21:23

0

如果你的數據是CSV格式,而不是文本格式,可以使用下面的命令:

text=csvread('yourfile.csv',1,1,[1 1 m n]) 

顯然,如果您的數據只能以文本格式提供,手動轉換它與使用textscan選項一樣多,但如果您的文本文件正在其他地方生成,您可以控制輸出格式,可以簡化流程。

+0

感謝Prototoast。截至目前該文件在.txt中,但如果我用csv獲得它,你的解決方案將是完美的。 – Maddy 2012-03-01 04:22:44