如何将Matlab带Ubc数组索引与切片的运算代码转换为C语言i、j嵌套索引实现
Matlab切片转C嵌套循环实现
索引转换核心逻辑
Matlab数组为1起始索引,C数组为0起始索引,转换时将Matlab中的索引值直接减1,即可对应到C数组的相同元素位置。
已知固定参数:Nx=Ny=40,u=1,Ubc为尺寸(Nx+2, Ny+2) = (42, 42)的二维浮点数组。
切片范围映射
逐行拆解原Matlab代码中的切片范围:
- 切片
Ubc(2:Nx+2, 2:Ny+1):Matlab行范围242,列范围241;转换为C索引后行范围141,列范围140 - 切片
Ubc(1:Nx+1, 2:Ny+1):Matlab行范围141,列范围241;转换为C索引后行范围040,列范围140
两个切片逐元素运算后,输出数组F的维度为41行、40列,C中可定义为double F[Nx + 1][Ny]。
可直接编译的嵌套循环实现
// 引入浮点绝对值计算头文件 #include <math.h> const int Nx = 40; const int Ny = 40; const double u = 1.0; double Ubc[Nx + 2][Ny + 2]; double F[Nx + 1][Ny]; // 外层循环遍历Matlab第一维(行方向) for (int i = 1; i <= Nx + 1; i++) { // 内层循环遍历Matlab第二维(列方向) for (int j = 1; j <= Ny; j++) { // 逐元素代入原Matlab运算公式 F[i][j] = 0.5 * u * (Ubc[i][j] + Ubc[i-1][j]) - 0.5 * fabs(u) * (Ubc[i][j] - Ubc[i-1][j]); } }
运算化简
由于已知u=1,fabs(u)=1,上述逐元素计算公式可直接化简减少运算量,结果完全等价:
// u=1时的等价化简 F[i][j] = Ubc[i-1][j];
内容的提问来源于stack exchange,提问作者mcgrane5
相关产品推荐
相关产品推荐

