2013-10-30 72 views
0

我在Matlab中有四個52×140的矩陣。讓我們稱之爲abc,並d將函數應用於矩陣數組的所有元素

我想將eigs功能適用於海森矩陣[a,b;c,d]每一個點在像原來的矩陣:

for i = 1:52 
    for j = 1:140 
     eigs([a(i,j),b(i,j);c(i,j),d(i,j)]) 
    end 
end 

我怎樣才能做到這一點一個更簡單的方法,即沒有for循環?

+1

'for'循環是非常簡單和容易理解。在這種情況下,他們可能會比其他選項更快。另外,爲什麼你使用'eigs'而不是'eig'來處理2乘2的矩陣? – horchler

回答

1

這大概可以使用arrayfun和定義,自eig返回一個向量,結果只能被存儲在使用anonymous function(未經測試),你在一個單一的重複做動作

result = arrayfun(@(a_ij, b_ij, c_ij, d_ij) eigs([a_ij, b_ij; c_ij, d_ij]), ... 
    a, b, c, d, 'uniformoutput', false); 

注完成單元陣列。

你能說出的匿名函數a, b, ...代替a_ij, b_ij, ...的參數,因爲它們只在函數內部使用的,但我更喜歡這種方式,使之清楚,在函數內部使用的是標量,而參數到arrayfun是矩陣。就我個人而言,我經常用大寫/小寫來表示不同之處:

result = arrayfun(@(a, b, c, d) eigs([a, b; c, d]), A, B, C, D, 'uni', 0); 

但是你必須重命名你的變量。

1

嘗試這種解決方案把所有的矩陣開球:

>> abcd = cat(3,a,b,c,d); 
>> H = permute(reshape(permute(abcd,[3 1 2]),2,2,[]),[2 1 3]); 
>> size(H) 
ans = 
     2   2  7280 
>> i=3;j=2; 
>> [a(i,j),b(i,j);c(i,j),d(i,j)] 
ans = 
    0.4984 0.7935 
    0.3524 0.2273 
>> H(:,:,i+(j-1)*size(abcd,1)) 
ans = 
    0.4984 0.7935 
    0.3524 0.2273 
>> 

然後對H中的所有二維矩陣運行eigs:

E=arrayfun(@(i)eigs(H(:,:,i)),1:size(H,3),'uni',false); 
相關問題