我是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
答案 0 :(得分:0)
我认为这个问题不能用传统方式进行矢量化,我没有发现任何简化代码的可能性,这样做可以将性能提高〜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中的递归快得多,所以可能没有更好的方法。