我正在尝试编写代码以在线性方程组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];
}
答案 0 :(得分:2)
代码之间的一个区别来自于您将for循环索引更改为使用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代码中将sum
重置为零而在C中没有重置(MATLAB代码也有sum2
似乎没有使用?) 。这会导致y_prev[i]
的{{1}}出现差异。