2011-07-22 11 views
1

私はMatlabからAnsi-Cに移植するいくつかのルーチンに取り組んでいます。私はMatlabのベテランではないので、私はいくつかの潜在的な行についてあなたに尋ねるようにしています。MatlabからCへの移植

[-3, -2, -1, 0, 1, 2, 3] 
    [-3, -2, -1, 0, 1, 2, 3] 
    [-3, -2, -1, 0, 1, 2, 3] 
X= [-3, -2, -1, 0, 1, 2, 3] 
    [-3, -2, -1, 0, 1, 2, 3] 
    [-3, -2, -1, 0, 1, 2, 3] 
    [-3, -2, -1, 0, 1, 2, 3] 


    [-3, -3, -3, -3, -3, -3, -3] 
    [-2, -2, -2, -2, -2, -2, -2] 
    [-1, -1, -1, -1, -1, -1, -1] 
Y= [ 0, 0, 0, 0, 0, 0, 0] 
    [ 1, 1, 1, 1, 1, 1, 1] 
    [ 2, 2, 2, 2, 2, 2, 2] 
    [ 3, 3, 3, 3, 3, 3, 3] 

はこれです:そのk個の== 3、上の行は、以下の態様を有する2つの行列(XとY)を作ることになっていると仮定すると

1)

%Matlab 
[X,Y] = meshgrid(-k:k,-k:k); 

正しい?

2)次の文は、サブマトリックスを作成すると思いますが、通常のCで変換する有効な方法はありますか?

I = A(iMin:iMax,jMin:jMax,:); 

ありがとうございました!

+0

こんにちはvalvoline! Draytonはあなたの質問に十分に答えなかったのですか?なぜあなたは彼の答えを受け入れるためにクリックしなかったのだろうと思っています...? –

答えて

1

1):-)はい

2)私はあなたが(第二と第三のインデックスをループに持っていると思いますが(配列のJおよびK)それらを呼び出すと、フォームAの範囲のそれぞれをコピーすることができますiMin:iMax、j、k)を手動で入力します。

1

2番目の質問については、他のライブラリを使用したくない場合は、ショートカットはありません。この操作はarray slicingと呼ばれているので、類似したものを提供する可能性のあるCライブラリを検索するとGoogleが助けになるかもしれません。

また、CではなくC++で書いても構わない場合は、http://arma.sourceforge.net/docs.html#syntaxを参照してください。CおよびC++には他にもさまざまな線形代数ライブラリがありますが、アルマジロはMATLABが提供できるもの

+0

こんにちは、ご回答いただきありがとうございます。しかし、私はansi-cの部分のみを持つ組み込みボード用にプログラミングしているので、Cを使う必要があります。 – valvoline

1

1)はい、しかし、独自のコードを書いている場合は、複製からすべての領域を無駄にする理由はありません。 X-ベクターなどとY-ベクトル:

int X[] = {-3, -2, -1, 0, 1, 2, 3}; 
int Y[] = {-3, -2, -1, 0, 1, 2, 3}; 

は、あなたが同じ情報にアクセスすることを可能にするが(組み込みシステムに大きな問題になる可能性があります)メモリ無駄なくなります。 X(i,j)Y(i,j)にアクセスするのではなく、X[i]Y[j]にアクセスします。

2)配列の大きさによっては、要素ごとにアクセスするより効率的な選択肢があります。あなたは行優先順(すなわち

A_1,1 A_1,2 A_1,3 ... A_1、nは

A_2,1であなたの配列を格納していると仮定すると...

は、A_1保存されています1 A_1,2 A_1,3 ... A_1、nはA_2,1 ...

あなたは以下のことで、スライスをコピーすることができます。

/* Initialization code omitted, let A be n x m */ 
/* Also assuming that [i/j][Max/Min] are zero indexed */ 
int i, diff_i, diff_j; 
diff_i = iMax - iMin; 
diff_j = jMax - jMin; 

size_t stride = sizeof(YOUR DATA TYPE HERE) * (1 + diff_j); 

/* I = A(iMin:iMax,jMin:jMax,:); */ 
for(i = 0; i <= diff_i; i++){ 
    memcpy(&I[i*diff_j],&A[i*m + jMin],stride); 
} 

これは、一度に行をつかむのではなくなります一度に1つの要素。

関連する問題