Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab中3*3*N矩阵的矢量化特征值计算_Matlab - Fatal编程技术网

Matlab中3*3*N矩阵的矢量化特征值计算

Matlab中3*3*N矩阵的矢量化特征值计算,matlab,Matlab,目前,我正在使用以下代码获取特征值: A = randi(100,3,3,4000000); eig_vals = zeros(4000000,1); for i =1:4000000 eig_vals(i) = max(eig(A(:,:,i))) ; end 我需要帮助向量化我的特征值计算,而不使用for循环 谢谢, Prithivi您可以计算由较小的[3 x 3]矩阵组成的块对角矩阵的特征值: C=mat2cell(A,3,3,ones(1,size(A,3))); B=blk

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

A = randi(100,3,3,4000000);
eig_vals = zeros(4000000,1); 
for i =1:4000000
    eig_vals(i) = max(eig(A(:,:,i))) ;
end
我需要帮助向量化我的特征值计算,而不使用for循环

谢谢,
Prithivi

您可以计算由较小的
[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
不是最佳的块大小。您可以调整它以获得最佳性能。

您最好的选择是自己实现,然后将计算矢量化。您不能矢量化
eig
。但在你这么做之前:这真的是你程序中的瓶颈吗?矢量化不一定能产生更快的程序,MATLAB的JIT近年来变得非常好。@Chris Luengo,如果你有时间,你能发布这个实现吗?@Durkee:如果我有实现,我会发布,但我没有。我确信它的实现不是很复杂,但它会花费我更多的时间,而不是我能花在上面。好主意。减少循环迭代次数,但也不会占用太多内存。