我在Matlab中有四個52×140的矩陣。讓我們稱之爲a
,b
,c
,並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
循環?
我在Matlab中有四個52×140的矩陣。讓我們稱之爲a
,b
,c
,並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
循環?
這大概可以使用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);
但是你必須重命名你的變量。
嘗試這種解決方案把所有的矩陣開球:
>> 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);
'for'循環是非常簡單和容易理解。在這種情況下,他們可能會比其他選項更快。另外,爲什麼你使用'eigs'而不是'eig'來處理2乘2的矩陣? – horchler