2

私はここで立ち往生しています。サイズNxNの行列がdouble配列に格納されています。次に、特定の列、たとえば最初の列を削除します。そこで、サイズNxN-1の新しいdouble配列を作成し、もちろん最初の列を除いて、最初の行列から2番目の行列に値をコピーしました。しかし、最初の配列を2番目の配列に設定したいと思います。ここでブランキングしています。

double matrix[N][N]
//fill up the matrix code here...


// remove first column of array
double newMatrix[N][N-1];
for(i = 0; i < N; i++){
    for(j = 1; j < N; j++){
        newMatrix[i][j-1] = matrix[i][j];
    }
}
matrix = newMatrix; // how do I set this correctly?  Do I need to realloc the first array?
4

3 に答える 3

2

Cで配列を割り当てることはできません。これは、コンパイラが指示していると思います。このような動的メモリ管理を行うには、配列の代わりにポインタを使用する必要があります。私はあなたがあなたが望むことをすることができるようにあなたがどのようmalloc()にそして働くかについて読んでおくことを提案します。free()

編集:

列(または行)のみを削除する場合は、別の解決策が思い浮かびます。配列で使用されている行と列の数を追跡します。次に、最初にコピーを作成せずに、元の配列内の行または列を削除できます。データを削除列(または行)を超えて左(または上)に移動してから、サイズカウンターをデクリメントします。(これが理にかなっていることを願っています。そうでない場合は、私に知らせてください。詳しく説明します。)

于 2013-03-08T01:16:39.120 に答える
1

array + stride_x[x] + stride_y[y]array [i] [j]から要素にアクセスする代わりに、 ;から要素にアクセスすることを選択する場合があります。ここで、配列は元々double matrix[N*N];またはとして導入されましdouble *matrix = malloc(sizeof(double)*N*N);た。

stride_y [x]には、元々、すべての行の列のオフセットが含まれます。0 1 2 3 4 ... N-1およびstride_y[y]には、元の行幅0 N 2 * N 3*Nを掛けた同様のオフセットが含まれます。

これらの1-D配列から、完全な行と列をより簡単に削除または交換できます。これは、たとえば、便利な場合があります。行列式計算の再帰的実装/ガウスの消去法。

于 2013-03-08T06:40:07.470 に答える
1

Code-guruのように、malloc()とfree()は大いに役立つはずですが、uが最後の列を削除したいだけの場合は、2つの配列は必要ありません。

double matrix[2][3] = {1,2,3,4,5,6}; //declaring a 2 by 3 matrix 



for (i=0;i<2;i++) //rows
{   
    for (j=0;j<3-1;j++) //columns - 1
    {
        printf("%.1f ",matrix[i][j]); //I chose to display matrix...
    }
    printf("\n");
}
于 2013-03-08T02:17:14.950 に答える