目前,我正在使用以下代码获取特征值:
A = randi(100,3,3,4000000);
eig_vals = zeros(4000000,1);
for i =1:4000000
eig_vals(i) = max(eig(A(:,:,i))) ;
end
我需要在不使用for循环的情况下向量化本征值计算的帮助。
谢谢, 普里西维
答案 0 :(得分:2)
您可以计算由较小的[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
不是最佳的块大小。您可以对其进行调整以获得最佳性能。