我在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
循环?
答案 0 :(得分:1)
这可以使用arrayfun完成,并使用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);
请注意,由于eig
返回一个向量,因此结果只能存储在单元格数组中。
你可以命名匿名函数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 :(得分: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:
中的所有2D矩阵上运行eigsE=arrayfun(@(i)eigs(H(:,:,i)),1:size(H,3),'uni',false);