我在 Matlab 中有四个 52×140 矩阵。让我们称它们a
为 、b
、c
和d
:
我想将该函数应用于原始矩阵中每个点eigs
的 Hessian 矩阵,例如:[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并使用匿名函数(未经测试)定义您在单次迭代中执行的操作来完成
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);
请注意,由于eig
返回向量,因此结果只能存储在元胞数组中。
您可以将匿名函数的参数命名a, b, ...
为a_ij, b_ij, ...
,因为它们仅在函数内部使用,但我更喜欢这样,以明确在函数内部您使用的是标量,而参数 toarrayfun
是矩阵。就个人而言,我经常使用大写/小写来表示差异:
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 中的所有 2D 矩阵上运行 eigs:
E=arrayfun(@(i)eigs(H(:,:,i)),1:size(H,3),'uni',false);