繁体   English   中英

正向替换无法在C语言中按预期工作

[英]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版本,并且没有代码的某些上下文,因此可能会有其他差异。)

变量ik在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM