[英]Forward substitution doesn't work as expected in C
我试图编写代码以在线性方程Ax=B
的系统中找到A
,所以我使用了LU分解。 现在我已经正确地拥有了L和U,为了得到B = Ly中的y,我被困在正向替换中。
我在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];
}
这些代码之间的区别在于,您更改了for循环索引以使其与C中从零开始的索引一起工作。(我无法运行MATLAB版本,并且没有代码的某些上下文,因此可能会有其他差异。)
变量i
和k
在C代码中具有小于1的值。 这正是循环索引所需要的,但是当您使用i
来控制k
的内部循环中的迭代次数时,就会出现问题。 即使i
具有不同的值,这两个版本的代码都为i-1
。 例如,在外循环的第一次迭代中,内循环在MATLAB代码中运行一次,而在C语言中根本不运行。
可能的解决方法是将C代码中的内部循环重写为
for (int k = 0; k < i; k++)
{
sum = sum +Low[i][k]*y_prev[k];
}
第二个区别是您要在MATLAB代码中将sum
重置为零,而不是在C语言sum2
其重置为零(MATLAB代码中还有一个sum2
似乎没有被使用?)。 对于i>0
这将导致y_prev[i]
差异。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.