将循环从 Matlab 转换为 C

标签 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]));
        }
       }
      }

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

最佳答案

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

关于将循环从 Matlab 转换为 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28925950/

相关文章:

c++ - ODBC 调用 SQLFetch 与 SQLFetchScroll

c# - 从 C header 自动创建 C# 包装器?

c - 将数组作为参数从 C 传递给 x86 函数

c - 补码截断?

c - 如何在openvms中读取命令行参数来运行c程序?

返回代码大于零的 Matlab 退出力

Matlab imshow() 没有正确显示图像

matlab - 在 matlab 中将冒号作为函数的参数传递

matlab - 在 Matlab 中绘制球体时如何定义半径?

matlab - 如何将 fir1 阻带滤波器转变为多阻带滤波器