正向置换不能按预期的方式工作C

问题描述:

我试图编写代码来找到线性方程组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

一个区别来自于你的方式已经改变了对循环指数与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