2017-03-17 3 views
0

私は、MATLABのような構文を使ってC言語で自分のタイプの行列を使いたいと思っています。プリプロセッサを使用したソリューションはありますか?ありがとう。 (次のコードは動作しません)。matlabの構文を使用したCのフラットアレイ

include <stdio.h> 
#define array(i,j) array.p[i*array.nrows+j] //??????????? 

typedef struct 
{ 
unsigned int nrows; 
unsigned int ncols; 
float* p; 
} matrix; 

int main() 
{ 
    unsigned int i=4,j=5; 
    float v=154; 
    matrix a; 

    a.p=(float*) malloc(10*sizeof(float)); 

    array(i,j)=v; 

return 0; 
} 
+0

matlabシンタックスの必要条件はありますか? – DeiDei

+4

'10 * sizeof(float)'は '4 * 5'フロートを格納するには不十分です..さらに、' nrows'は初期化されていません... – LPs

+0

[これは解決策です](http://ideone.com/Et50o7 ) – LPs

答えて

0

あなたがしようとする場合はたぶん、このアプローチは、あなたの

#include <stdio.h> 
#define array(arr,i,j) (arr.p[ i * arr.nrows + j ]) //??????????? 

typedef struct 
{ 
unsigned int nrows; 
unsigned int ncols; 
float* p; 
} matrix; 

int main() 
{ 
    unsigned int i=4,j=5; 
    float v=154; 
    matrix a; 

    a.p=(float*) malloc(10*sizeof(float)); 

    array(a,i,j)=v; 

return 0; 
} 

を助けることができる:(i、j)は、それが "A" への呼び出しをしようとします。

+1

'nrows'と' ncols'は挿入されていません。 – LPs

+0

また、マクロには大量のカッコがありません。 –

3

あなたの配列の名前をマクロに渡す必要がありますが、そういうことができます。

FYIと同じように、MATLABの順序は、より一般的に「列メジャー」として知られています。 C順序は、より一般的には「行の主な順序」として知られています。

私は、彼らが正常に動作するマクロのために必要なので)自分のメモリ割り当てと寸法の2)あなたの初期化を1の補正の自由を取っている:ここでは順序が列大手である

include <stdio.h> 

#define INDEX(mat, i, j) (mat).p[(i) * (mat).nrows + (j)] 

typedef struct 
{ 
    unsigned int nrows; 
    unsigned int ncols; 
    float *p; 
} matrix; 

int main() 
{ 
    unsigned int i = 4, j = 5; 
    float v = 154; 
    matrix a = {i, j, NULL}; 

    a.p = malloc(i * j * sizeof(float)); 
    INDEX(a, i - 1, j - 1) = v; 

    return 0; 
} 

が、インデックスはまだゼロベースです。私は[i, j]の代わりにインデックス[i - 1, j - 1]にアクセスしてこれを強調しました。あなたは本当に物事のMATLABの方法に準拠するために1ベースのインデックスをしたい場合は、これにマクロを変更することができます。

#define INDEX(mat, i, j) (mat).p[((i) - 1) * (mat).nrows + (j) - 1] 

次にmainに、あなたが行うことができます:

INDEX(a, i, j) = v; 
0

はありがとうございましたあなたの助け。 私は初期コードでいくつかの簡単なエラーを修正しました。 私はあなたの答えを見て、私はいくつかの構造体のプリプロセッサでジェネリック#defineルールを使ってmatlabの構文を実装することはできないと思います。 代わりに、次のコードとして#defineルールを各特定の構造体に書き込む必要があります。

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

#include <stdio.h> 
#define a(i,j) a.p[i*a.nrows+j] 

typedef struct 
{ 
unsigned int nrows; 
unsigned int ncols; 
float* p; 
} matrix; 

int main() 
{ 
    unsigned int i=4,j=5; 
    float v=154; 
    matrix a; 

    a.nrows=10; 
    a.ncols=10; 

    a.p=(float *) malloc(100*sizeof(float)); 

    a(i,j)=v; 

    return 0; 
} 
関連する問題