【问题标题】:Efficient way to perform loops of matrix multiplications执行矩阵乘法循环的有效方法
【发布时间】:2018-07-05 14:24:27
【问题描述】:

我有一个涉及矩阵相乘、相加和存储的实现。是这样的,

A = 0;
b = 0;
for i=1:1225
  ... load A_i operator 
  A_i_obj = load([path_temp,'A_',num2str(i),'.mat']);
  A_i     = (A_i_obj.A);
  % z_i is some variable of size Nx1 that I compute in this loop something like
  % x is some variable of size Nx1 calculated above this loop
  z_i = A_i*x; 
  % I have to perform some operations like these 
  y_i = A_i*(z_i + x);
  A = A + A_i*A_i'
  b = b + A_i*y_i;
end 
% A and b will be used here something like
soln = inv(A)*b;

我的问题是上面的代码消耗了大量的模拟时间。即使循环内的操作是高效的(比如说 ~0.01 分钟),整个循环实现仍然消耗约 12-13 分钟。有人可以帮助我并提出一种有效的方法吗?非常感谢!

【问题讨论】:

  • 我不确定是否可以根据此代码 sn-p 提出明智的建议 - 因为它不太现实。它在每次迭代时加载相同的文件,并且您不会对y_i 执行任何操作。如果你能举一个更现实的例子就更好了。
  • 个人资料,但拜托,minimal reproducible example 很好,但它必须是现实的。这并不能总结您的问题,因为代码没有意义。
  • 看看mapreduce
  • 您好,我想为写得很糟糕的伪代码道歉。我已经更正了我的代码,以显示我如何一次加载一个运算符。我很乐意分享更多细节,但我必须以某种伪代码格式再次提供它们。感谢您,如有任何困惑,我们深表歉意!

标签: matlab matrix-multiplication processing-efficiency


【解决方案1】:

我不明白在每次迭代中加载mat 文件的意义...仅在 for 循环之外加载一次数据。毕竟,该操作非常耗时,更重要的是,一旦将数据加载到变量中,就不必再执行了。

A = 0;
A_i = load('A_i.mat');

for i = 1:1225
    % ...

    y_i = A_i * (z_i + x);
    A = A + A_i * A_i';
end

附带说明,您正在使用以下重载将load 函数的输出直接分配给变量:

S = load(___) loads data into S, using any of the input arguments in the previous syntax group.
  - If filename is a MAT-file, then S is a structure array.
  - If filename is an ASCII file, then S is a double-precision array containing data from the file.

所以我想你的文件是 ASCII 格式的,否则你的 A_i 将不是一个矩阵,而是一个结构数组。另外,不要使用' 运算符转置矩阵,而是使用.',因为第一个对应于复共轭转置:

A = A + A_i * A_i.';

由于您省略了在循环内运行的部分代码,我无法做更多的事情来提高它的性能。

【讨论】:

  • 虽然可能是这样,但我相信您是优化错误选择的伪代码。
  • 嗨,对不起,我只是将我的代码显示为某种伪代码。我已经更正了我的代码以显示我是如何加载运算符的。
【解决方案2】:

简介,简介,简介

我猜想加载矩阵的过程会害死你,但很难说。为了更好地了解哪个步骤正在杀死您,请使用

开始您的代码
profile on

并以

结束
profile viewer

然后再次运行它。当代码完成时,它会显示每次调用所花费的时间,这将帮助您找出问题所在。

【讨论】:

    猜你喜欢
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    相关资源
    最近更新 更多