三维矩阵的特征值

时间:2016-10-28 08:36:47

标签: matlab

我有三维矩阵H,其中第三维的大小为200000,每个维度包含一个2 * 2的矩阵

H=reshape([imgx(:),imgxy(:),imgyx(:),imgy(:)]',2,2,[]);

我想计算所有200000个矩阵的特征值。为此,我使用的公式:

[V,D]=eig(H);

但问题是,eig()不适用于三维矩阵。如何解决而不使用循环

1 个答案:

答案 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;