执行矩阵乘法循环的有效方法

时间:2018-01-26 08:46:55

标签: matlab matrix-multiplication processing-efficiency

我有一个实现,涉及乘法矩阵,求和,存储它们。就像这样,

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分钟。有人可以帮助我,并建议一个有效的方法来做到这一点?非常感谢!

2 个答案:

答案 0 :(得分:0)

我没有在每次迭代中加载 IF :al_arg = 1 THEN call procedure1; ELSIF :al_arg = 2 THEN call procedure2; ELSE //something else END IF; 文件......只加载数据一次并在for循环之外。毕竟,操作非常耗时,更重要的是,一旦将数据加载到变量中,就不必再执行了。

mat

在旁注中,您使用以下重载将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

所以我假设您的文件是ASCII格式,否则您的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. 将不是矩阵而是结构数组。另外,不要使用A_i运算符来转置矩阵,而是',因为第一个对应于复共轭转置:

.'

由于您省略了循环内部运行的部分代码,因此我无法做更多工作以提高其性能。

答案 1 :(得分:0)

个人资料,个人资料,个人资料

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

启动代码
profile on

并以

结束
profile viewer

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