2013-10-24 59 views
0

我試圖讀取包含不同(但已知)大小的多個數組的文本文件。讀取具有多個分隔符和不同長度的矩陣的文本文件

我知道以下有關的文件:

每個文件有大小爲m×n的矩陣,在格式如在這個例子中:

[[0.05,0.15,0.25,0.35,0.0] 
[0.05,0.1,0.15,0.2,0.25], 
[0.05,0.1,0.15,0.2,0.25], 
[0.05,0.1,0.5,0.6,0.1]] 

這之後是尺寸PX 1的矩陣:

[3,3,4,5,5,5,5,6] 

最後一個標量(無方括號在這裏)

3 

我發現這樣做的最簡單方法如下:(!使用MATLAB相比更合適的語言)

  1. 條從文本文件中的括號
  2. 使用data = importdata()讀取文件。這導致在一個陣列中,用含有PX 1矩陣和所述標量(具有因爲矩陣大小之間的差的一些的NaN)
  3. 拉出數據的最後兩行,A = data(1:m, 1:n); b = data(m+1,1:p); c = data(m+2,1);

這似乎相當笨重。我可以將2維矩陣(包括括號)複製並粘貼到MATLAB命令窗口中,MATLAB知道如何解析它。這讓我覺得有一個更優雅的方法可以用一個MATLAB函數來完成這個任務。

整個例如文本文件:

[[0.05,0.15,0.25,0.35,0.0], 
[0.05,0.1,0.15,0.2,0.25], 
[0.05,0.1,0.15,0.2,0.25], 
[0.05,0.1,0.5,0.6,0.1]] 
[3,3,4,5,5,5,5,6] 
3 
+0

你的第一行有4個元素;接下來的三個有五個。我爲本地示例的第一行添加了0.0。 – Pursuit

+0

您使用哪種「比MATLAB更適合的語言(用於文本處理)」?它有MEX支持嗎? –

+0

FWIW,可以使用''regexprep(str,'[\ [\]]','')'從Matlab中的字符串中去除'[',']'。另見'strrep'。 – Pursuit

回答

3

如果您習慣通過這個文件的內容爲eval命令,這似乎是最直接的方法:

%Read in the full file as a string (this is often easier than handling the file directly) 
fid = fopen('somefile.txt'); 
str = fread(fid,inf,'uint8=>char')'; 
fclose(fid); 

str = ['{' str '}']; %Add braces, this will gather the arrays when evaluated. 
data = eval(str);  %Evaluate 

這發癢我的一定是錯誤的感覺有點,因爲它是一個相當脆弱的方式來處理數據。但對於有限的數據集,它應該工作得很好。

samefile.txt文件包含以下(注意我添加了一個0到第一線路):

[[0.05,0.15,0.25,0.35,0], 
[0.05,0.1,0.15,0.2,0.25], 
[0.05,0.1,0.15,0.2,0.25], 
[0.05,0.1,0.5,0.6,0.1]] 
[3,3,4,5,5,5,5,6] 
3 

運行在上述過程之後,我有一個data變量具有以下內容:

>> data{1} 
ans = 
     0.05      0.15      0.25      0.35       0 
     0.05      0.1      0.15      0.2      0.25 
     0.05      0.1      0.15      0.2      0.25 
     0.05      0.1      0.5      0.6      0.1  
>> data{2} 
ans = 
    3  3  4  5  5  5  5  6 
>> data{3} 
ans = 
    3 
+0

謝謝!這工作! – raoulcousins

相關問題