2012-08-14 84 views
1

我在將Horner算法的僞代碼翻譯成MatLab中的正確代碼時遇到了一些麻煩。我認爲我的困惑源於代碼假設第一個向量條目可以被0引用的事實,而在MatLab中,這必須是1.我試圖相應地修改我的代碼,但是我不明白它正常工作。該pseducode如下:MatLab - Horner算法

input n, (a_i, : 0 ≤ i ≤ n), z_0 
    for k = 0 to n-1 do 
     for j = n-1 to k step -1 do 
      a_j = a_j + z_0*a_(j+1) 
     end do 
end do 
output (a_i: 0 ≤ i ≤ n) 

這是我在MATLAB,其中a在多項式表示係數的輸入向量寫這樣的嘗試:

function x = horner(a,z_0) 
n = length(a); 
for k = 1:n-1 
    for j = n-1:-1:k 
     a(j) = a(j) + (z_0)*a(j+1); 
    end 
end 
x = a; 

我想這對矢量a = [1 -4 7 -5 -2]這表示多項式中的係數。我也設置了z_0 = 3。根據我的書,我應該收到輸出信息a = [1 8 25 37 19],但是我的代碼給出了輸出矢量a = [-245 -313 -146 -29 -2]

如果有人能幫我清理這段代碼,我會非常感激!

+0

看起來李對於循環的一個簡短的說法:我會說它應該是'k = 1:n'和'for j = n:-1:k' – 2012-08-14 19:01:39

+0

'編輯polyval'顯示了Matlab人員如何實現算法。 – Jonas 2012-08-14 19:16:56

回答

5

試試這個 - 這裏a是多項式係數的向量,其中列出了(1)作爲多項式中最高階項的係數。如果您的矢量方向相反,只需設置

b = fliplr(a) 

並使用矢量調用函數b。該函數將使用Horners算法評估多項式。注意,這裏假設z_0是你想要的多項式的求值,因此返回一個值,該值(不是矢量)

function x = horner(a,z_0) 
n = length(a); 
result = a(1); 
for j = 2:n 
    result = result*z_0 + a(j); 
end 
x = result; 

如果你想在值z的載體傳遞給評估這樣你就可以評估多個分(z元素)的同時,您可以通過載體傳遞它們:

function x = horner(a,z) 
n = length(a); 
m = length(z); 
result = a(1)*ones(1,m); 
for j = 2:n 
    result = result.*z + a(j); 
end 
x = result; 

現在返回x將是你的結果矢量

+0

太棒了!非常感謝您的幫助。有一個brainfreeze,並沒有意識到矢量應翻轉:)。非常感激! – Kristian 2012-08-14 19:05:40

+1

@Kristian沒問題,請注意,您也可以使用'polyval'函數 - 查看它的文檔。 – mathematician1975 2012-08-14 19:08:02

+0

再次感謝。是的,我真的很熟悉這個功能,但是因爲我真的想學習這些東西,所以我希望能夠自己編寫算法:) – Kristian 2012-08-14 19:13:50