2016-07-06 13 views
-4

これはMatlab関数であり、C言語で書き直そうとしています。入力x1は3次元配列で、hx、hy、hzは単なる数値です。私が抱えている問題は、3D配列の要素がどのように割り当てられているかを正確に理解することです。この最後の行はどのように機能しますか?matlab関数をCに変換する

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

この質問には答えますが、[Matlab Coder](http://it.mathworks.com/videos/generating-c-code-from-matlab-code-http: 68964.htmlを参照)、生成されたコードを調べます。 – Vahid

答えて

1

あなたは

を持っている場合、これは、(1)(終わり)まで同様に3にAからすべての要素を設定します

A(1:end) = 3; 

あなたは、MATLAB行列Aを考えてみましょう

B = A(5:8) 

次に、Bには要素A(5)、A(6)、A(7)、A(8)が含まれます。私の記憶が正しければ、MATLABは最初の列であり、cはそれが理由である、最初の行である

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); 

:コードは

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

たのであれば、コードはのように書くことができ

x1 [j] [i] ... x1 [i] [j]ではありませんが、私は間違ったことを思い出しているかもしれません。

これは配列がメモリにどのように格納されるかに影響するため、コードが効率的であるかどうかを考慮する必要があります。このwikipedia articleは、配列が行のメジャーとメジャーな列のメジャーにどのように格納されるかを説明しています。基本的に、キャッシュに書き込む必要がないため、メモリ内の互いに近い要素にアクセスする方が高速です。

これに関する詳細:What is "cache-friendly" code?

関連する問題