【问题标题】:MATLAB array indexing and slicingMATLAB 数组索引和切片
【发布时间】:2021-05-30 05:12:48
【问题描述】:

我正在编写当前用 C 重写 Matlab 脚本。当我到达 Matlab 脚本的最后几行时,将执行一个 for 循环并遍历一个数组。因为我试图用 C 重写程序,所以 Matlab 脚本中的切片符号让我感到困惑。我在下面附上了困扰我的代码行。

我将如何在嵌套 for 循环索引中编写这行代码,仅使用 i 和 j,因为您显然不能在 c 中切片。仅供参考 u = 1,Ubc 是大小为 (NX+2, NY+2) 的二维数组。其中 NX = NY = 40。

下面是 Matlab 中我需要转换为 for 循环索引的代码行。

Nx = 40;
Ny = 40;
u = 1;
Ubc = rand(Nx + 2, Ny + 2);
% First the i interfaces
F =   0.5*    u *( Ubc(2:Nx+2,2:Ny+1) + Ubc(1:Nx+1,2:Ny+1)) 
     - 0.5*abs(u)*( Ubc(2:Nx+2,2:Ny+1) - Ubc(1:Nx+1,2:Ny+1));

【问题讨论】:

  • Ubc 和 F 数据如何存储在你的 C 代码中?作为一维数组,您可以使用单 [ ] 索引获取元素,还是作为二维数组,您可以使用双 [ ][ ] 索引获取元素?您是否希望数据以列优先顺序存储,就像在 MATLAB 端一样? C 代码是否会通过 mex 例程与 MATLAB 通信,您将在 MATLAB 和 mex 例程之间来回发送数据?

标签: arrays matlab indexing


【解决方案1】:

你可以在循环中计算相同的

Nx = 40;
Ny = 40;
u = 1;
Ubc = rand(Nx + 2, Ny + 2);
F = zeros(Nx + 1, Ny);
for z1 = 1 : Nx + 1
    for z2 = 1 : Ny
        F(z1, z2) =   0.5*    u *( Ubc(z1 + 1, z2 + 1) + Ubc(z1, z2 + 1)) 
                    - 0.5*abs(u)*( Ubc(z1 + 1, z2 + 1) - Ubc(z1, z2 + 1));
    end
end

您不应该在 Matlab 中使用 ij 作为循环索引。两者都是虚数单位。

【讨论】:

    猜你喜欢
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    相关资源
    最近更新 更多