在MATLAB中如何将矩阵A的稀疏模式应用到矩阵FWtrans上
MATLAB 稀疏模式匹配赋值优化方案
性能问题原因
你现有代码的性能问题核心来自两处:
- 冗余的for循环完全无用:循环体中直接对全部索引
k批量赋值,循环执行多少次就重复执行多少次全量赋值,属于纯算力浪费 - 稀疏矩阵的循环赋值会触发多次内部内存重分配,MATLAB稀疏矩阵的性能优化完全针对向量化操作,循环操作会带来数量级的性能下降
优化实现
最小改动版本(仅删除冗余循环即可)
直接去掉for循环,保留你原有逻辑,用向量化赋值即可:
Wtrans = transpose(W); As = sparse(A); FWtrans = F * Wtrans; [m,n] = size(FWtrans); k = find(As); X = spalloc(m,n, nnz(A)); % 直接向量化赋值,无需循环 X(k) = FWtrans(k);
更简洁高效的版本(一行实现稀疏模式匹配)
利用稀疏逻辑矩阵点乘,自动保留A非零位置的数值,代码更短性能更高:
Wtrans = transpose(W); FWtrans = F * Wtrans; % 直接用A的非零掩码点乘,自动保留对应位置数值,自动输出稀疏矩阵 X = FWtrans .* spones(A);
最高性能版本(直接构造稀疏矩阵)
如果你的矩阵规模极大,用sparse构造函数直接生成结果,避免中间步骤的额外开销:
Wtrans = transpose(W); FWtrans = F * Wtrans; [i,j,~] = find(A); X = sparse(i, j, FWtrans(sub2ind(size(FWtrans),i,j)), size(FWtrans,1), size(FWtrans,2));
内容的提问来源于stack exchange,提问作者user17472876
相关产品推荐
相关产品推荐

