0

以下では、型定義を使用します。

typedef float zreal;
typedef float* zvect;
typedef float** zmatr;

zvect全長が列付きnのaとして再キャストしたいとします(もちろんそれが分割されていると仮定します)。「オブジェクト」は、行ごとに値をパックします。つまり、はタイプの場所です(行ベクトルとして考えられます)。これを次のように変換する必要があります。zmatrmmnzvectzmatra = [a1 a2 ... ap]azvectzmatr

zmatr = [a1
         a2
         ...
         ap]

ここで、a1,...,apは行ベクトルを表します。(値を新しいエンティティにコピーすることなく)自分zvectをに再キャストする方法はありますか?zmatrそうするための最も効率的な方法は何ですか?ベクトルを直接使用して行列の値にアクセスすることは避けたいことに注意してください。つまり、wherereturnsのようz[getIndex(i,j,ncols)];になりgetIndex(int i,int j, int ncols)ますi*ncols+j。任意の提案をいただければ幸いです。

更新:次のコードがその役割を果たしているようです:

zvect v;
create_vector(&v,100);

zmatr zm;
zmatr* matrix = &zm;

*matrix = (zmatr)malloc(sizeof (zvect) * 10);
int i;
for (i = 0; i < 10; ++i) {
    (*matrix)[i] = &(v[i*10]);
}
4

1 に答える 1

0

これらは大きく異なり、変換できません。

typedef float* zvect;
typedef float** zmatr;

タイプzvectは へのポインタfloatまたは の配列ですfloat

zmatrは へのポインタfloat *、または の配列ですfloat *

+-------+          +-------+
| zvect | -------> | float |
+-------+          | float |
                   | float |
                   | ...   |
                   +-------+

+-------+          +---------+           +-------+
| zmatr | -------> | float * | --------> | float |
+-------+          | float * | --        | float |
                   | float * |   \       | ...
                   | ...     |    \
                   +---------+     \     +-------+
                                    ---> | float |
                                         | float |
                                         | ...

つまり、これは 2D 配列でzmatrなく、実際には 1D 配列へのポインターを要素として含む 1D 配列です。

個人的には、私は固執します:

float elem = arr[i*ncols+j];

これは明確、簡潔、かつ明示的です。

于 2013-01-23T18:46:34.167 に答える