まず、C++ では配列のサイズを追跡する方法がありません (割り当てられたメモリの量のみ)。そのためsize
、配列の をパラメーターとして渡すか、グローバルにする必要があります。私は、次の宣言でこの仮定を行います。
int* SubMatrix(int** matrix, int size){
int* submatrix = new int[(size - 1) * (size - 1)];
// Do stuff
return submatrix;
}
第二に、行列が正方形の場合は、割り当てられた配列のサイズがどこにあるか、上記の宣言を使用する方がよい場合があります(N-1)*(N-1)
(Kevin Loney の回答How do I declare a 2d array in C++ using new?に関するヒープの行列宣言を参照してください)。したがって、配列は行列としてアクセスできます。ただし、セルにアクセスするには、少し計算が必要です。
for (int i = 0; i < size - 1; ++i)
for (int j = 0; j < size - 1; ++j)
submatrix[i * (size -1) + j] // Element at [i][j]
最後に、関数によって返される配列は行列ポインターになりました。
int* matrix = SubMatrix(matrix, size);
返される行列の次元は次のとおりです。(size-1)*(size-1)
あなたの例に関して:
x = {{1,2,3},{1,2,3},{1,2,3}};
int* y = SubMatrix(matrix, 3);
// y is now a matrix of size (size-1)*(size-1)
本当に (本当に) 2 次元配列が必要な場合:
int** SubMatrix(int** matrix, int size){
int** submatrix = new int*[size - 1];
for (int i = 0; i < size - 1; ++i)
submatrix[i] = new int[size - 1]
// Do stuff
return submatrix;
}