2016-09-25 49 views
1

我試圖編寫代碼來找到線性方程組Ax=B中的A,所以我使用了LU分解。現在我已經正確地使用了L和U,爲了得到B = Ly中的y,我被困在正向替換中。正向置換不能按預期的方式工作C

我在MatLab中編寫了一些完美工作的代碼,但是我無法得到相同的結果,用C重寫代碼。所以我想知道是否有人可能知道我做錯了什麼,我沒有完全使用到C.

這是我的代碼在MatLab的:

y(1,1) = B(1,1)/L(1,1); 
for i= 2:n 
    sum=0; 
    sum2=0; 
    for k = 1: i-1 
     sum = sum + L(i,k)*y(k,1); 
    end 
    y(i,1)=(B(i,1)-sum)/L(i,i); 
end 

其中L是我的下三角矩陣,B是相同大小的矢量,並且是n 2498在這種情況下。

我的C代碼如下:

碼之間
float sum = 0; 

y_prev[0]=B[0]/(float)Low[0][0]; 

for (int i = 1; i < CONST; i++) 
{ 
    for (int k = 0; k < i-1; k++) 
    { 
     sum = sum +Low[i][k]*y_prev[k]; 
    } 

    y_prev[i]= (B[i]- sum)/(float)Low[i][i]; 
} 
+3

你在C float中的位置(Low [0] [0])'你是不是指'(float)Low [0] [0]'?這裏的'(float)'應該是一個類型不是函數。 –

+0

究竟是什麼問題? (除了浮法投)。如果你得到錯誤,可能是因爲我們沒有看到數組定義/分配代碼。 –

+0

我沒有得到錯誤代碼,但輸出向量不正確。我馬上改變演員的東西,謝謝。 – SDj

回答

2

一個區別來自於你的方式已經改變了對循環指數與C.零基於索引的工作(我不能運行MATLAB版本,並且沒有代碼的一些上下文,所以可能存在其他差異)。

變量ik的值在C代碼中小於1。這正是你想要的循環索引,但當你使用i來控制k內循環的迭代次數時會出現問題。這兩個版本的代碼都是i-1,儘管i具有不同的值。例如,在外循環的第一次迭代中,內循環在MATLAB代碼中運行一次,但在C代碼中完全不運行。

一個可能的解決將是重新編寫的C代碼內環路

for (int k = 0; k < i; k++) 
{ 
    sum = sum +Low[i][k]*y_prev[k]; 
} 

第二個區別是,你在MATLAB代碼,但不是在C重置sum爲零(MATLAB代碼也有一個sum2,似乎沒有被使用?)。這將導致i>0y_prev[i]不同。

+0

謝謝!你是對的我完全錯過了。不幸的是,我的代碼仍然無法正常工作,它給我的第一個結果罰款,然後就像總是cero:/ – SDj

+0

@SDJ:我注意到了另一個區別,並將其添加到答案 - 這有幫助嗎? –

+0

不是真的(那sum2不應該在那裏,我以前使用它,忘記刪除它) – SDj