6

Cで記述されたMEXファイルで2Dスパース行列を作成する方法。行列を作成した後、Cのように要素に個別にアクセスする方法、たとえばmat[i][j]

関数を使用するのに疲れmxCreateNumericArrayましたが、要素にアクセスできず、スパース行列として作成することもできませんでした。

助けてください

4

1 に答える 1

10

mxCreateSparseのこのページを参照してください。 次に、 mxSetPrmxSetIrmxSetJc、および対応する「get」バージョンを確認します。

スパース行列を割り当てる方法の例を次に示します。 これは古いリンクだと思いますが、私の知る限り、変更はありません。

基本的に、それがどのように機能するかは、irデータに行インデックスが含まれていることです。データには、配列へのインデックスのjrリストが含まれています。irたとえば、スパース行列を割り当てる方法に関するリンクでは、次のコードを使用します。

...
static double  static_pr_data[NZMAX] = {5.8, 6.2, 5.9, 6.1};
static int     static_ir_data[NZMAX] = {0, 2, 1, 3};
static int     static_jc_data[COLS+1] = {0, 2, 4};
...

配列は、からのstatic_jc_dataインデックスが行列の列に対応していることを示します。その範囲(から)内で、のエントリはマトリックス内の値を提供し、正しい行を提供します。static_jc_data[c]static_jc_data[c+1]-1static_pr_datastatic_ir_datacstatic_jc_data[c]static_jc_data[c+1]-1static_pr_datastatic_ir_data

たとえば、ここでのマトリックスは次のようになります。

A = [ 5.8  0
      0    5.9
      6.2  0
      0    6.1];

要素に個別にアクセスする方法に関する質問に答えるには、i,jth要素が存在するかどうかを検索し、存在する場合は0を返す必要があります。これを行うには、全体から検索しstatic_ir_data[static_jc_data[j]]て、要素が存在するstatic_ir_data[static_jc_data[j+1]-1]かどうかを確認しますi。含まれている場合、の対応するエントリにエントリstatic_pr_dataが含まれます。そうでない場合は、0を返します。

ただし、通常、スパースマトリックスの使用では、特定の要素が存在するかどうかを確認するためにマトリックスを頻繁に検索する場合は、その使用方法について検討することをお勧めします。i,j通常、各エントリを検索するのではなく、ゼロ以外の要素を1回だけ実行することで、実行している操作を実行する方がはるかに優れています。

ああ、最後にもう1つ。MEXコードでは、すべてのインデックスは0ベースですが、MATLABでは1ベースであることに注意してください。それは楽しみに追加する必要があります。

于 2011-05-23T14:16:03.610 に答える