0

我在 Matlab 中有四个 52×140 矩阵。让我们称它们a为 、bcd

我想将该函数应用于原始矩阵中每个点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循环?

4

2 回答 2

1

这可能可以使用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);

但是你将不得不重命名你的变量。

于 2013-10-30T19:55:10.167 回答
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 矩阵上运行 eigs:

E=arrayfun(@(i)eigs(H(:,:,i)),1:size(H,3),'uni',false);
于 2013-10-30T20:43:42.320 回答