matlab - 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 循环。
谢谢, 普里蒂维
解决方案
您可以计算由较小[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
不是最好的块大小。您可以调整它以获得最佳性能。
推荐阅读
- swift - 如何在 Swift 中从 Realm 保存和加载 GKGameModelPlayer?
- python - 将小部件插入到布局的开头。基维
- laravel - 为什么我不能在 laravel 中发布包
- aem - 在视觉 AEM 中基于特定条件渲染标题标签
- bash - bash字符串变量扩展中的空格字符未读取并在case语句中执行命令
- google-sheets - 谷歌表格查询:过滤列选择具有特定条件的行:“select * WHERE “row5”=“ColContas”或“row5”=“ColNum””
- php - Google Places Nearby API 使用 CURL PHP 仅返回 6 个结果
- java - 使用 CrudRepository 方法 findById(Long Id) 时是否可以更改列名?
- linux - Linux 中 mv 命令的使用
- php - 使用 SSL+AUTH 发送 PHP PEAR 邮件失败