【问题标题】:Converting a loop from Matlab to C将循环从 Matlab 转换为 C
【发布时间】:2015-03-08 20:14:26
【问题描述】:

我有一个 (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]));
        }
       }
      }

我得到了错误的结果。请问如何改正?

【问题讨论】:

  • @mch:这是正确的翻译,因为 matlab 使用基于 1 的索引,而 c 使用基于 0 的索引。
  • @Daniel 是的,我忘了。 for(i=j-1;i=0;i--) 应该是 for(i=j-1;i&gt;=0;i--)。所以循环将i 设置为0 并在第一次迭代之前终止。
  • @mch 谢谢..当我纠正了你指出的错误并将 (U[in+j]/U[j*n+j]) 放在外面丹尼尔回答的内部循环,它工作正常

标签: c matlab


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 2012-10-13
    相关资源
    最近更新 更多