0

この関数を作成する必要があります。パラメータはランダムなN*N配列であると想定されます。(N-1)*(N-1)そして、配列を返す必要があります。これどうやってするの?

int** SubMatrix(int** matrix){
    int** submatrix=new int*[size-1];
        ................................
        ................................
        return submatrix;
}

このコードは正しいですか?

その上、メイン関数で言うと、私はすでにこの配列を持っています

x={{1,2,3},{1,2,3},{1,2,3}};

関数を呼び出すにはどうすればよいですか?

呼び出し:

int y[2][2]=SubMatrix[x]

は間違っており、

int** y=SubMatrix[x] 

も間違っています...

4

1 に答える 1

0

まず、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;
}
于 2012-11-12T19:49:50.653 に答える