2015-09-26 47 views
1

我對matlab非常新,並且試圖理解矢量化。我通常能夠找到一種向量化我的代碼的方法,但這次是不同的。請注意,e()和f()不是函數調用,而是數組,a(i,j)是一個矩陣。這裏的問題是e(i)的值取決於e(i-1)的值。 f(i)也會發生同樣的情況。有沒有一種方法來加速這個循環以獲得速度?自我依賴MAT​​LAB循環的矢量化

該函數取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

你需要所有的值e(i)和f(i)還是隻是最後一個感興趣的值? – Daniel

+0

[在matlab中向量化遞推方程]可能的副本(http://stackoverflow.com/questions/30367100/vectorizing-a-recurrence-equation-in-matlab) –

+1

@ms:我看不到有可能應用那裏的解決方案。認爲這是一個不同的問題。 – Daniel

回答

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(i)只使用e(1),但我沒有看到任何可能以矢量化的方式實現這些計算。如果你看一下配方,有涉及越來越多的嵌套括號:

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-loops比matlab中的遞歸快得多,可能沒有更好的辦法。

+0

謝謝,我正在研究遞歸ATM,因爲我不知道它在Matlab中有多快和多快。我習慣於低級語言,因此矢量化是我必須熟悉的一個概念。感謝您的回答和時間。 – Fredaugermorin