正向替换在C中不能按预期工作

时间:2016-09-25 19:54:05

标签: c matlab substitution forward

我正在尝试编写代码以在线性方程组A中查找Ax=B,因此我使用了LU分解。现在我已经正确地使用了L和U,我被困在前向替换中以便在B = Ly中得到y。

我在MatLab中编写了一些完美的代码,但是我无法在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];
}

1 个答案:

答案 0 :(得分:2)

代码之间的一个区别来自于您将for循环索引更改为使用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代码中将sum重置为零而在C中没有重置(MATLAB代码也有sum2似乎没有使用?) 。这会导致y_prev[i]的{​​{1}}出现差异。