1

C ++では、あるマトリックスから別のマトリックスにデータをコピーしようとしています。私のコードは次のとおりです。

int data[height][width];
void MyCode::setData ( int newData[height][width] )
{   
    for ( int i = 0; i < height; i ++ )
    {
        for ( int j = 0; j < width; j ++ )
        {
            data[i][j] = newData[i][j];
        }   
    }       
}

ここでの私の問題は、これらの「for」ループに時間がかかりすぎて、コードがここで停止することです(メモリが過負荷になっている可能性があり、ビデオフレームを読み取っています)。私はこのようなポインタを使用することについて疑問に思いました:

int* data[height][width];
void MyCode::setData ( int* newData[height][width] )
{   
     data = newData;
}

しかし、それはうまくいきませんでした、私は理由がわかりません。誰かが私にこれに対するより良い解決策を提案できますか?

4

2 に答える 2

3

これを回避する1つの方法は、サイズが幅*高さの1D配列を使用することです。このようにして、2つの間のデータを簡単にmemcpyできます。

次の手順を実行することで、行と列から1D配列の最終的な位置を簡単に把握できます。

int index = column + (row * width);

編集:2D配列を使用する必要がある場合は、次元の1つがわかっている必要があります。

そのため、次のことができます。

int data[height][width];
void MyCode::setData ( int (*newData)[width] )
{   
    for ( int i = 0; i < height; i ++ )
    {
        for ( int j = 0; j < width; j ++ )
        {
            data[i][j] = newData[i][j];
        }   
    }       
}

C ++では、テンプレートベースのソリューションなどを使用する方が実際には優れていますが、高さの次元が間違っている配列を渡すと問題が発生し、コンパイラはそれをキャッチしません。

周りにはたくさんのテンプレートマトリックスライブラリがあります。例えば:

http://sourceforge.net/projects/tmv-cpp/

于 2012-09-27T08:41:38.963 に答える
1

Boostの多次元配列を見てください。より効率的なコピー操作を実装している可能性があります。

http://www.boost.org/doc/libs/1_51_0/libs/multi_array/doc/user.html

さらに、Blitz++についても見ていきます。このlibは、c ++のテンプレートメタプログラミングを使用して一時的なものを排除し、そのような行列演算を適切に最適化した可能性があります。これは彼らのプロジェクトが述べていることです:

Blitz ++は、Fortran77/90と同等のパフォーマンスを提供する科学計算用のC++クラスライブラリです。テンプレート手法を使用して、高いパフォーマンスを実現します。Blitz ++は、密な配列とベクトル、乱数ジェネレーター、および小さなベクトル(多成分またはベクトル場を表すのに便利)を提供します。

http://blitz.sourceforge.net/

お役に立てば幸いです。

于 2012-09-27T09:48:25.767 に答える