2017-09-19 41 views
0

例えば、a = [[1, 5, 9], [4, 6, 7], [8, 2, 3]]のような数字のリスト(uint64_t in C)は、(argvを介して)Cプログラムの引数として渡され、そのデータにアクセスできるようにする)をCプログラムで2D行列として使用するか?私はunint64_tタイプの非事前に定義されたサイズの行列で働いている私のCプログラムでPythonからCにuint64_t行列としてリストのリストを渡す

uint64_t matrix[nrows][ncols]

+0

「argv」は大きなデータには適していません。パイプのようなプロセス間通信を使用します。 – Daniel

答えて

2

それを行うには多くの方法がありますが、最も簡単にはおそらく最初の行列を平坦化されています

def flatten(a): 
    yield len(a) 
    cols = max(len(i) for i in a) 
    yield cols 
    for i in a: 
     for j in i: 
      yield j 
     for j in range(0, cols - len(i)): 
      yield 0 

は、次に、あなたのCプログラムにパラメータを供給するためにその結果を使用することができ、あなたが行列を構築することができていることから(C99は必須):

#include <stdlib.h> 
#include <inttypes.h> 

void load_matrix(uint64_t *matrix, char **p, int alen) { 
    while (alen-- > 0) 
     *matrix++ = atoi(*p++); 
} 

void do_work(uint64_t matrix[nrows][ncols], int nrows, int ncols) { 
    ... 
} 

int main(int argc, char **argv) { 
    int nrows = atoi(argv[1]), ncols = atoi(argv[2]); 

    // check ncols and nrows and argc 
    ... 

    uint64_t *matrix; 
    matrix = malloc(nrows * ncols * sizeof(*matrix)); 

    // check matrix isn't NULL 
    ... 

    load_matrix(matrix, argv + 3, nrows * ncols); 
    do_work(matrix, nrows, ncols); 
    ... 
} 

これは単なるイラストです。つまり、atoiのようなものは適切ではありません。

C89を使用する場合は、フラットな配列に対処する必要がありますが、最終的には同じことです。

ただし、行列が大きい場合は、実際には必要ありません。同様の方法で(おそらくより効率的な実装で)同様の方法でシリアル化しますが、バイナリデータを直接扱い、共有メモリ、ファイル、ソケット、またはパイプを通してCプログラムに渡す必要がありますそれ以上の処理は必要ありません。

非常に大きなデータセットで作業していた場合、PythonとCの両方で同じ表現で作業したいと思っています。おそらく共有メモリやファイルを使用したいと思うでしょう。

+0

誰かがコードを実行しようとする場合に備えてちょうど重要な編集です。 ':'は、Pythonコードの最後から2番目の行にありません。答えをありがとう。 – PyCV

関連する問題