我有三维矩阵H,其中第三维的大小为200000,每个维度包含一个2 * 2的矩阵
H=reshape([imgx(:),imgxy(:),imgyx(:),imgy(:)]',2,2,[]);
我想计算所有200000个矩阵的特征值。为此,我使用的公式:
[V,D]=eig(H);
但问题是,eig()不适用于三维矩阵。如何解决而不使用循环?
答案 0 :(得分:4)
我认为你正在寻找的是:你制作一个(稀疏)块对角矩阵A
:
A = [a1 0 0 ...
0 a2 0 ...
0 0 a3 ...
: : : \ ]
ai
1 < i < 200,000
表示原始数组的“页码”(第3维)。您可以使用spdiags()
执行此操作。然后,A
的特征值是原始矩阵的特征值。
但是,这种方法存在一些问题。在使用ai
之后,特征值与它们所属的eig(s)
矩阵之间的关联难以重建。另外,我认为它总是过度杀伤而不是实际上比循环更快,因为你的子矩阵非常小。
由于它们都是2×2,它们的characteristic equations是二次的并且非常简单易于解决。那么为什么不手动呢?
% Compute the necessary factors
a = 1;
b = -H(1,1,:) - H(2,2,:);
c = H(1,1,:) .* H(2,2,:) - H(1,2,:) .* H(2,1,:);
% to be used in the quadratic formula:
lambda1 = (-b + sqrt(b.^2 - 4*a*c)) /2/a;
lambda2 = (-b - sqrt(b.^2 - 4*a*c)) /2/a;
使用H
原始3D数组。自a = 1
起,这简化为
sqdiscr = sqrt(b.*b - 4*c);
lambda1 = -b + sqdiscr;
lambda2 = -b - sqdiscr;