Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
![]() |
#1 |
高级会员
注册日期: 2019-11-21
帖子: 3,006
声望力: 66 ![]() |
![]()
我欢迎任何有关以下代码优化问题的帮助:
我有一个存储在单元格数组A的相同大小( [s1 s2] )的N个稀疏矩阵的集合,以及存储在向量w的相应数量的标量权重。我想计算A中所有矩阵的总和,以w存储的值加权。通过我的程序的迭代,只有w的值改变了。因此,我可以计算出结果中非零元素的数量,并使用spalloc为它预分配一些内存。 目前,我有这样的事情: result = spalloc(s1,s1,number_of_non_zero); for i=1:N result = result + w(i)*A{i}; end 我确实需要对这一部分进行优化,此部分目前要占用程序中的大部分计算时间(已通过性能分析工具检查过)。 一些其他信息: -上面的代码运行了数百万次,因此即使是很小的改进也值得欢迎。 A矩阵来自有限元代码(1D或2D) -如果我可以节省一些时间(例如使用cell2mat(A) ),那么离开单元结构就没有问题。 感谢您提供有关如何加快这部分代码的提示。 一种。 回答: 我不能肯定地说这种解决方案是否会提高计算效率,但这是其他尝试... 如果您确实必须将矩阵表示为稀疏矩阵(即,完整的矩阵占用过多内存),而MATLAB中的内置稀疏表示无法提供所需的性能,则可以尝试将稀疏矩阵表示为其他矩阵道路。具体来说,您可以将它们表示为N×3矩阵,其中前两列包含所有非零值的矩阵行和列索引,第三列包含非零值。您可以使用函数FIND将数据转换为这种形式,如下所示: for iMatrix = 1:numel(A) [r,c,v] = find(A{iMatrix}); A{iMatrix} = [rcv]; end 每次需要计算这些矩阵的加权和时,首先需要将值乘以权重: B = A; %# Store a temporary copy of A for iMatrix = 1:numel(B) B{iMatrix}(:,3) = w(iMatrix).*B{iMatrix}(:,3); end 然后,您可以使用函数ACCUMARRAY计算最终总和: B = vertcat(B{:}); %# Convert B from a cell array to an N-by-3 matrix result = accumarray(B(:,1:2),B(:,3)); 在这种情况下,可变result将是一个完整的矩阵。如果需要将result作为稀疏矩阵,则可以在对ACCUMARRAY的调用中添加其他参数, 如下所示: result = accumarray(B(:,1:2),B(:,3),[],[],[],true); 更多&回答... |
![]() |
![]() |