首页 > 解决方案 > Matlab中3*3*N矩阵的向量化特征值计算

问题描述

目前我正在使用以下代码来获取特征值:

A = randi(100,3,3,4000000);
eig_vals = zeros(4000000,1); 
for i =1:4000000
    eig_vals(i) = max(eig(A(:,:,i))) ;
end

我需要帮助来矢量化我的特征值计算而不使用 for 循环。

谢谢, 普里蒂维

标签: matlab

解决方案


您可以计算由较小[3 x 3]矩阵组成的块对角矩阵的特征值:

C=mat2cell(A,3,3,ones(1,size(A,3)));
B=blkdiag(sparse(C{1}),C{2:end});    % A sparse block diagonal matrix
eig_vals = max(reshape(eig(B),3,[]),[],1);

但这可能不是最有效的。因此,您可以逐部分处理数据以减少创建稀疏矩阵的时间:

s = 4000;
f = find(kron(speye(s),ones(3)));       % indices for matrix blocks
B = spalloc(s*3,s*3,s*3*3);             % preallocate the sparse matrix composed of 4000 matrices of size [3 x 3]
eig_vals = zeros(4000000,1);           
for k = 0: 4000000/s-1
    B(f)= A(:,:,k*s+1:k*s+s);
    eig_vals(k*s+1:k*s+s) = max(reshape(eig(B),3,[]),[],1);
end

s=4000不是最好的块大小。您可以调整它以获得最佳性能。


推荐阅读