1

double の 2D 配列が必要です。幅は約 900 です。高さも同様です (幅の値は同じです)。

2 つのループ (幅用と高さ用) を処理するには、処理する 900X900 画像のすべてのピクセルにアクセスする必要があります。

配列のサイズが大きすぎます (raw と列の数を指定する際のエラー)。

計算時間を最適化し、2 つのループで 1 つのピクセルを処理するたびにメモリを解放するために、動的配列を使用してそれを確立することを考えました。

しかし、2D動的配列を宣言するために必要な構文が本当に見つかりません(malloc、配列要素の値を設定し、メモリを解放します)。

4

3 に答える 3

3

クラスにラップします。

class Matrix2D {
    typedef std::vector<double> Column;
    std::vector<Column> columns;
public:
    Matrix2D(unsigned int width, unsigned int height) :
    columns(width, Column(height)) {
    }

    double& at(unsigned int i, unsigned int j) {
        return columns[i][j];
    }
};

Matrix2D matrix(900, 900);

matrix.at(45, 65) = 1234.5678;
于 2013-03-07T13:58:34.850 に答える
2

の2D配列が必要ですdouble

C ++を使用しているので、醜いメモリ管理を処理するSTLクラスを使用する必要があります。したがって、実際に探しているのはstd::vector< std::vector<double> >、またはコードを読みやすくするためです。

#include <vector>
typedef std::vector<double> DVector;      // row represented by vector of doubles
typedef std::vector<DVector> MyVector;    // 2D array as a vector of these rows

そして、可能な限り動的割り当てを使用しないでください。RAIIイディオムを活用する:

{
    MyVectorarr;  // vector object with automatic storage duration
} // <-- vector is automatically destructed when execution goes out of scope

あなたを助けるかもしれない質問:
多次元ベクトルベクトル
のベクトルの初期化?
ベクトルのベクトル

于 2013-03-07T13:43:45.443 に答える
1

私はmallocをC++ではなく純粋なCに関連付けます(前の回答があなたを指しているので、std :: vectorを使用する必要があります)。ただし、本当に必要な場合:

// allocate the memory in a block
double* block = (double *) malloc(sizeof(double) * xSize * ySize);
// allocate memory for the accessor array
double* accessor = (double*) malloc(sizeof(double*) * xSize);
// assign memory addresses
double* curPtr = block;
for (int i = 0; i < xSize; ++i) {
    accessor[i] = curPtr;
    curPtr += ySize;
}

// you can now access the array via accessor[x][y]

// now need to free malloced memory:
free(accessor);
free(block);

このようにすると、RAIIパターンに関連付けることを強くお勧めします。そうしないと、最終的にメモリリークが発生します。STLのコンテナを使用することはより良いアプローチです。

于 2013-03-07T13:50:33.323 に答える