正向置换不能按预期的方式工作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];
}
答
一个区别来自于你的方式已经改变了对循环指数与C.零基于索引的工作(我不能运行MATLAB版本,并且没有代码的一些上下文,所以可能存在其他差异)。
变量i
和k
的值在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>0
的y_prev[i]
不同。
你在C float中的位置(Low [0] [0])'你是不是指'(float)Low [0] [0]'?这里的'(float)'应该是一个类型不是函数。 –
究竟是什么问题? (除了浮法投)。如果你得到错误,可能是因为我们没有看到数组定义/分配代码。 –
我没有得到错误代码,但输出向量不正确。我马上改变演员的东西,谢谢。 – SDj