与えられた:
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8
チャンクサイズ CS を指定して、2 次元配列 (struct MATRIX) を struct MATRIX の配列に分割したい: cs が 2 であると仮定すると、答えは次のようになります。
Seg[0]:
1 2
1 2
1 2
Seg[1]:
3 4
3 4
3 4
....
Seg[3]:
7 8
7 8
7 8
ここに私の行列構造があります:
typedef struct MATRIX {
int nrow;
int ncol;
int **element;
} MATRIX;
そして、これらを分離する関数は次のとおりです。
void SegmentMatrix(MATRIX input,MATRIX* segs,int Chunksize, int p) {
int i,j,r;
//Allocate segs
for (i = 0; i<p;i++)
{
CreateMatrix(&(segs[i]),input.nrow ,Chunksize,0);
}
//Now Copy the elements from input to the segs
//where seg0 takes from 0 to cs cols of a, and all their rows, and seg1 takes from cs to 2cs ...
printf("Stats:\n\t P: %d\t CS: %d\n",p,Chunksize);
for (r = 0; r<p; r++) {
for (i = 0; i<input.nrow;i++) {
for (j = r*Chunksize; j<r*Chunksize+Chunksize-1; j++) {
//I tried (&(segs[r]))->element... Doesn't work, produces wrong data
segs[r].element[i][j] = input.element[i][j];
}
}
PRINTM(segs[r]);
}
}
PRINTM は基本的に行列を出力し、segs[r].nrow と ncol をチェックして制限を認識し、CreateMatrix は次の入力 (&matrix、行数、列数、filltype) と malloc を内部から取得することに注意してください。
filltype:
0- generates zeroth matrix
1- generates identity
else A[i][j] = j; for simplicity
問題は、マトリックス Segs[i] を出力すると、新しく追加された値ではなく、CreateMatrix によって指定されたデフォルト値がすべて出力されることです。
明確化: わかりました。SegmentMatrix 関数の最後の PRINTM をチェックすると、for ループが発生しなかったかのように行列が出力されます。別名、for ループを削除しても同じ出力が得られます。この行が間違っています (SegmentMatrix から取得)
Segs[r].element[i][j] = input.element[i][j];