我有一个实现,涉及乘法矩阵,求和,存储它们。就像这样,
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分钟。有人可以帮助我,并建议一个有效的方法来做到这一点?非常感谢!
答案 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
然后再次运行它。代码完成后,它会显示每次调用所花费的时间,这将帮助您找出问题所在。