2013-01-04 78 views
3

我有一個數據文件看起來如下塊到MATLAB陣列

3 1.0 1.4 1.7 
2 1.2 1.5 
1 1.1 
2 1.1 1.2 

對於每一線,所述第一整數表示浮點數的在這條線的數量。

現在我想所有的數據加載到一個單一的MATLAB陣列,而忽略了第一列,也就是說,我想這樣的

>>arr = [1.0, 1.4, 1.7, 1.2, 1.5, 1.1, 1.1, 1.2] 

一個數組,如果每一行,我們有相同數量的浮點數的,我可以簡單地做這樣的

>>arr = load datafile ; 
>>arr = arr(:,2:end) ; %ignore the first column 
>>arr = arr(:) ; 

但是,如果我們在每行不同數量的浮點數,似乎我們不能直接加載的文件到矩陣。有沒有簡單的方法來完成這個?

謝謝。

回答

4

首先,讓我們看的編號的字符串:

C = textread('myfile.txt', '%s', 'delimiter', '\n'); 

結果是字符串單元陣列,所以讓我們申請str2num每個細胞以獲得的數值:

C = cellfun(@str2num, C, 'Uniform', false); 

現在讓我們丟棄每個單元格中的第一個元素:

C = cellfun(@(x)x(2:end), C, 'Uniform', false); 

最後,我們連接吃了所有的值到一個載體中:

arr = [C{:}] 

這是完整的代碼:

C = textread('test.txt', '%s', 'delimiter', '\n'); %// Read data 
C = cellfun(@str2num, C, 'Uniform', false);  %// Convert to numbers 
C = cellfun(@(x)x(2:end), C, 'Uniform', false); %// Remove first values 
arr = [C{:}] 

arr = 
    1.0000 1.4000 1.7000 1.2000 1.5000 1.1000 1.1000 1.2000 
+1

謝謝EitanT,這是一個很好的解析文件的方法。 textread看起來有點像Python的open(somefile).readlines()或open(somefile).read()。split(一些分隔符) – Junjie

1

一個簡單的方法來做到這一點。將通過線只讀取文件行

fid = fopen('data.txt'); 
arr = []; 
tline = fgetl(fid); 
while (tline ~= -1) 
    temp = str2num(tline); 
    arr = [arr temp(2:end)]; 
    tline = fgetl(fid); 
end 

您也可以嘗試使用loadcell功能,雖然我沒有嘗試,所以我還不能肯定它將爲你工作。

+0

謝謝ioums,雖然這個解決方案看起來有點C風格 – Junjie