将matlab函数转换为C

时间:2016-07-06 00:08:17

标签: c matlab multidimensional-array

这是一个Matlab函数,我正在尝试用C语言重写它。输入x1是一个三维数组,而hx,hy,hz只是数字。我遇到的问题是确切地了解如何分配3D数组的元素。这最后一行如何运作?

function Ax = D_XX_YY_ZZ(x1,hx,hy,hz)

[mx1, my1, mz1]=size(x1);

Ax = (x1(1:mx1-2,2:my1-1,2:mz1-1)+ ...
 +x1(3:mx1,2:my1-1,2:mz1-1) )/(hx^2) + ...
 (x1(2:mx1-1,1:my1-2,2:mz1-1)+ ...
 +x1(2:mx1-1,3:my1,2:mz1-1) )/(hy^2) + ...
 (x1(2:mx1-1,2:my1-1,1:mz1-2)+ ...
 +x1(2:mx1-1,2:my1-1,3:mz1) )/(hz^2) ;

1 个答案:

答案 0 :(得分:1)

假设你有一个matlab矩阵A。

 A(1:end) = 3;

这将所有元素从A(1)设置为A(结束)到3.同样,如果你有

 B = A(5:8)

然后B将包含元素A(5),A(6),A(7)和A(8)。

如果代码是

那么代码
 Ax = x1(3:mx1,2:my1-1,2:mz1-1) )/(hx^2)

可以写成:

 for (int i = 3; i <= mx1; i++)
     for(int j = 2; j <= my1-1; j++)
         for(int k = 2; k <= mz1-1; k++)
              Ax[i-3][j-2][k-2] = pow(x1[j][i][k], 2);

如果我没记错的话,matlab是第一列,c是第一行,这就是为什么它是x1 [j] [i] ...而不是x1 [i] [j],但我可能记得错了所以你可能希望确认一下。

另请注意,这会影响数组在内存中的存储方式,因此如果您关心代码是否有效,则应考虑到这一点。这个wikipedia article解释了如何在数组中存储行主,并在matlab专栏中。基本上,访问内存中更靠近彼此的元素更快,因为你必须写入更少的缓存。

更多相关信息:What is "cache-friendly" code?