将函数应用于矩阵数组的所有元素

时间:2013-10-30 19:36:46

标签: matlab matrix indexing

我在Matlab中有四个52×140的矩阵。让我们称他们为abcd

我想将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循环?

2 个答案:

答案 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矩阵上运行eigs
E=arrayfun(@(i)eigs(H(:,:,i)),1:size(H,3),'uni',false);