自相关MATLAB循环的矢量化

弗雷道格莫林

我对Matlab还是很陌生,正在尝试了解向量化。我通常能够找到一种方法来对我的代码进行矢量化处理,但是这次有所不同。请注意,e()和f()不是函数调用,而是数组,而a(i,j)是矩阵。这里的问题是e(i)的值取决于e(i-1)的值。f(i)也会发生相同的情况。有没有一种方法可以对此循环进行矢量化处理以提高速度?

该函数采用A一个三对角对称矩阵,b为Ax = b线性系统的解,并输出sol:该系统的解。该代码按原样工作,我只想在可能的情况下使其更快。希望其他详细信息有所帮助。

function [sol] = MySolTridiagDirect(A,b)
   %Adds 2 slack variables
   a = [zeros(size(A,1),1),A,zeros(size(A,1),1)];
   %Adds solutions to slack variables 
   b = [zeros(1,size(b,2));b;zeros(1,size(b,2))];

   e = NaN(size(A,1)+1,1);
   f = NaN(size(A,1)+1,1);
   x = NaN(size(A,1)+1,1);

   e(1) = 0;
   f(1) = 0;
   x(1) = 0;

   for i=2:size(f,1)
       e(i) = (-a(i-1,i+1)) / (a(i-1,i-1)*e(i-1,1) + a(i-1,i));
       f(i) = (b(i) - a(i-1,i-1)*f(i-1)) / (a(i-1,i-1)*e(i-1,1) + a(i-1,i));    
   end
   %% Solver for variable 'x' (solution)
   x(end) = f(end);
   for i=size(f,1)-1:-1:2
      x(i) = e(i)*x(i+1) + f(i);
   end
   sol = x(2:end,:);
end
丹尼尔

我认为无法以传统方式将这个问题向量化,我没有发现任何简化代码的可能性,因此可以将性能提高约2倍。

a2=diag(a,2);
a0=diag(a,0);
a1=diag(a,1);

for i=2:size(f,1)
    e(i) = (-a2(i-1)) / (a0(i-1)*e(i-1) + a1(i-1));
    f(i) = (b(i) - a0(i-1)*f(i-1)) / (a0(i-1)*e(i-1) + a1(i-1));    
end

为了找到矢量化,我使用了符号工具箱来显示完整公式,仅使用e(1)计算e(i),但是我看不到以矢量化方式实现这些计算的任何可能性。如果看一下公式,就会涉及到越来越多的嵌套方括号:

n=4;
f=sym('f',[n,1]);
e=sym('e',[n,1]);
a1=sym('a1',[n,1]);
a0=sym('a0',[n,1]);
a2=sym('a2',[n,1]);
b=sym('b',[n,1]);

for i=2:size(f,1)
    e(i) = simplify((-a2(i-1)) / (a0(i-1)*e(i-1) + a1(i-1)));
    f(i) = simplify((b(i) - a0(i-1)*f(i-1)) / (a0(i-1)*e(i-1) + a1(i-1)));    
end

我知道评估此类公式的唯一可能性是递归和for循环。由于for循环比matlab中的递归要快得多,因此可能没有更好的方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章