Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
回复
 
主题工具 显示模式
旧 2019-12-14, 20:13   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 优化稀疏矩阵的加权和

我欢迎任何有关以下代码优化问题的帮助:

我有一个存储在单元格数组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);

更多&回答...
poster 当前离线   回复时引用此帖
回复


发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 20:34


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.