2013-05-29 33 views
2

我已經在MATLAB中使用python獲得了一個項目的數據。我有3個不同的尺寸爲mxn,mxn + 1和mxn + 2的矩陣。我在python scipy.io.savemat('set1.mat', mdict ={'abc1':abc1})中使用了這個命令。矩陣的每一行實際上應該是一行行向量(長度爲p)而不是標量,因此矩陣實際上是mx(n)*p,mx(n+1)*pmx(n+2)*p如何告訴MATLAB我輸入的數據是一系列向量,而不僅僅是一系列字母?

舉個例子,我在MATLAB文件的頂部定義爲兩種情況

A = ones(1,5) 
B = 2*ones(1,5) 
C = 3*ones(1,5) 

現在可以直接在MATLAB我可以這樣寫:

abc1 = [A B C] 

這很奇怪,因爲儘管它可能看起來,給我我想要的輸出。

abc1 =  
Columns 1 through 14  
    1  1  1  1  1  2  2  2  2  2  3  3  3  3 
Column 15  
    3 

現在,如果我使用負載導入我的數據,我可以抓取abc1(1,:)。這給了我:

ans = A B C 

我也可以採取:

abc1(1,1)  
ans = A 

我怎樣才能得到它認識到,A是一個向量的名字嗎?

回答

2

從我瞭解你的問題聽起來好像你(在MATLAB中):

A = ones(1,5); 
B = 2*ones(1,5); 
C = 3*ones(1,5); 

load('set1.mat'); 

然後你想要做的事,如:

D = [abc1]; 

,並有結果是,爲abc1 = 'A B C',相當於[A B C]

這樣做有很多選擇。第一個也可能最簡單的是使用eval,但我不寒而慄,因爲大多數人認爲eval to be evil

在你的情況下,這看起來像:

D = eval(['[' abc1 ']']); 

一個更好的解決辦法是利用了dynamic field names招可以用結構來完成:

foo.A = ones(1,5); 
foo.B = 2*ones(1,5); 
foo.C = 3*ones(1,5); 

load('set1.mat'); 

D = [foo.(abc1(1,1)) foo.(abc1(1,2)) foo.(abc1(1,3))]; 

或者,如果你需要連接您可以使用cat函數進行更多的操作。例如:

D = []; 
for idx = 1:3 
    D = cat(2, D, foo.(abc1(1,idx))); 
end 

或者,如果你知道d的長度已創建它,你可以使用一個更具效率的版本之前:

D = zeros(1, num_elements); 
ins_idx = 1; 
for idx = 1:3 
    temp_num = length(foo.(abc1(1,idx))); 
    D(ins_idx:(ins_idx+temp_num-1)) = foo.(abc1(1,idx)); 
    ins_idx = ins_idx + temp_num; 
end 
+0

輝煌,謝謝大家。這個foo解決方案按原樣運行。唯一的問題是,我用我的項目的一個簡單例子問了這個問題。大約有30,000條數據條目,因此如此寫入「D」會在腳本上佔用大量時間和空間。我會試着操縱你給我看的東西,但我只是在等待稍微修改一些數據,所以我可以做到這一點。與此同時,您是否對如何更簡潔地加載如此多的數據有任何建議? – user1792403

+1

我已經添加了一些如何編寫「D」的替代示例,這可能有所幫助。 – Alan

+0

非常好,非常感謝,非常有幫助:) – user1792403

0

將數據加載到一個結構和使用動態字段標引:

s = load('yourfile'); 
s.(abc1(1,1)) 

但是,如果你把構建在上述的方式你的項目,你可能會碰到eval(),我總是建議避免。

相關問題