2017-11-06 15 views
1

numpyでは、array.sizearray.shapeで配列のサイズと形状にアクセスできますが、要素にはarray[i]を使ってアクセスできます。Numpy Like C for C

これをC構造でどのように達成するのですか?一つは

struct{ 
    int size; 
    int shape[2]; 
    int *elements; 
} int_array; 

ような何かを行うことができますが、その後の要素が

int_array.elements[i]. 

numpyのを好まないとしてアクセスすることができます。

サイズと形状は保存されますが、[]を使用して通常の方法で要素にアクセスできる配列を作成するにはどうすればよいですか?

+1

として使用することができます

#define INDEX(a) ((int(*)[a.shape[1]]) a.elements) 

質問は何ですか? –

+0

適切な(ローカル)VLA typedef(およびそのタイプの型キャストまたはヘルパー変数)で可能である必要があります。 – hyde

+0

C++がオプションの場合、[xtensor'をチェックアウト](https://github.com/QuantStack/xtensor) – Eric

答えて

2
  1. 必要以上に3倍大きい配列を割り当てます。
  2. 最初の3つのセルにサイズと形状を入れてください
  3. ポインタを3 * sizeof(int)でインクリメントしてください。
  4. サイズと形状の書き込みアクセサー。

通常の方法でアレイにアクセスできます。

解放する前に、ポインタから3 * sizeof(int)を差し引くことを忘れないでください。

+0

これは、要素の型が次元を保持するのに十分な大きさの配列に対してのみ有効です... –

1

あなたは2D配列(source)へのポインタをキャストする簡単なマクロを使用することができます。あなたは

#include <stdio.h> 
#include <stdlib.h> 

typedef struct{ 
    int size; 
    int shape[2]; 
    int *elements; 
} int_array; 


int main() { 
    int_array arr; 
    arr.shape[0] = 2; 
    arr.shape[1] = 3; 
    arr.elements = malloc(6*sizeof(*arr.elements)); 

    INDEX(arr)[0][1] = 2; 

    printf("%d", INDEX(arr)[0][1]); 
}