2

次の配列があります

   75.7740   70.6046   82.3458   43.8744   48.9764
   74.3132    3.1833   69.4829   38.1558   44.5586
   39.2227   27.6923   31.7099   76.5517   64.6313
   65.5478    4.6171   95.0222   79.5200   70.9365
   17.1187    9.7132    3.4446   18.6873   75.4687

たとえば、(1,1) から (2,2) のサブ配列を取得したいと思います

3.1833   69.4829  
27.6923   31.7099 

サブ配列で計算を行っているときは、大きな配列にも影響を与えたいと思います。

たとえば、私は Matrix クラスを持っています

template<class T>
class Matrix {
private:
    unsigned rows, cols;
    T* data_;
        .....
}

テスト

MatrixXd u(5, 5);
MatrixXd d(2, 2);
....
u.subblock(1,1,2,2) = d*d
or
u(1,1,2,2) = d*d

()/*-+ などのいくつかの演算子は既にオーバーロードしていますが、サブ配列を操作できるかどうかはわかりません。

4

4 に答える 4

2
u.subblock(1,1,2,2) = d*d

上記のような行を取得するには、ヘルパー クラスを定義できます。

template<class T>
class SubMatrix {
private:
    Matrix<T> *origin;
    unsigned int sr, sc, er, ec; // start and end row and column
        .....
};

次に、関数は、a を取得してオーバーロードされた aをMatrix::subblock返します(および a を取得し、場合によっては他の演算子を取得し、a を取得するinなど)。SubMatrixoperator =MatrixSubMatrixoperator =MatrixSubMatrix

このヘルパー クラスは、特定のウィンドウで元のマトリックスから読み取り/書き込みを行います。

于 2012-11-23T14:58:53.277 に答える
1

このための 1 つの可能な設計は、サブマトリックスがメインマトリックスの関連部分のビューになるようにすることです。つまり、独自のストレージを管理する代わりに、ビューは単にメイン マトリックスのストレージを再利用します。ビューが変更されると、メイン マトリックスも変更されます。

数値 Python は、このような設計を使用して多くの成功を収めています。

于 2012-11-23T14:56:35.027 に答える
0

実際の問題は、マトリックスクラスがサポートしている操作が多すぎることです。最低限必要な操作は次のようになります。

class MatrixI {
public:
  virtual int SizeX() const=0;
  virtual int SizeY() const=0;
  virtual float Map(int x, int y) const=0;
}

したがって、すべてを機能させるには、上記のインターフェイスに基づいて操作+、*などを実装する必要があります。

class Matrix {
public:
   /* +,* -operations here */
private:
   MatrixI *ptr; // owned ptr
};

次に、部分行列はMatrixIからMatrixIへの操作です。

class SubMatrix : public MatrixI {
public:
SubMatrix(MatrixI *orig, int pos_x, int pos_y, int sx, int sy);
/* implement minimum required functions here */
private:
  MatrixI *orig;
  int pos_x, pos_y;
  int sx,sy;
};
于 2012-11-23T16:09:26.507 に答える
0

あなたがそれを書く方法を尋ねているなら、それは一つのことです.

すでに書かれたソリューションが必要な場合は、Boost のmulti_arrayをチェックしてください。これは、ストレージのオーバーヘッドを最適化した N 次元の行列と同様に得られます。

使用する特定のクラスは、boost::multi_array_refboost::const_multi_array_ref です。

unique_ptr(注:経験からの公正な警告...これらは、現時点ではC++ 11の移動のみの型を格納する準備ができていません。)

于 2012-11-23T15:05:07.383 に答える