将循环从Matlab转换为C.

时间:2015-03-08 11:37:48

标签: c matlab

我有一个(3x5)矩阵,我希望得到它减少的行梯形式。 我想在C中实现它,所以我首先在Matlab中强制它,如下所示:

[L,U]=lu(a);
[m,n]=size(U);
disp('convert elements in major diagonal to 1')
  for s=1:m
  U(s,:)=U(s,:)/U(s,s);
  end
  for j=m:-1:2
   for i=j-1:-1:1
   U(i,:)=U(i,:)-U(j,:)*(U(i,j)/U(j,j));
 end
 end

上面的代码和rref函数给出了相同的结果。 将此代码转换为C时,我成功实现了LU分解,并将主要对角线中的元素转换为1,但是当这些嵌套循环实现时,

for j=m:-1:2
   for i=j-1:-1:1
   U(i,:)=U(i,:)-U(j,:)*(U(i,j)/U(j,j));
 end
 end

如下:

for(j=m-1;j>0;j--){
 for(i=j-1;i=0;i--){
     for(k=0;k<n;k++){
       U[i*n+k]=U[i*n+k]-(U[j*n+k]*(U[i*n+j]/U[j*n+j]));
        }
       }
      }

我得到了错误的结果。如何纠正它?

1 个答案:

答案 0 :(得分:3)

如果你仔细看看你的内循环。一旦达到k = j,就会编写元素U[i*n+j]U(i,j),并在以后的所有迭代中使用此更新值。您的matlab代码使用旧值,因为您实现了矢量化操作。如果你在内循环之外计算*(U[i*n+j]/U[j*n+j]),它应该没问题。