16

最初の質問です。今後 3 年間コードを開発する場合、C++11 を使い始めるのは良いことですか?

もしそうなら、Lapackで使用したい場合、行列を実装する「最良の」方法は何ですか? つまり、std::vector<std::vector< Type > > MatrixLapack との互換性は簡単ではありません。

これまで、行列を で保存していました(配列のサイズは 5 のような数値ではなく、変数として与えられるため、と Type* Matrix(new Type[N])のポインター形式は重要でした)。newdelete

ただし、C++11 では std::array を使用できます。このサイトによると、このコンテナが最適なソリューションのようです...どう思いますか?

4

2 に答える 2

20

まず最初に、C++ を学習する場合は、C++11 を学習します。以前の C++ 標準は 2003 年にリリースされたので、すでに10年前のものです。それはITの世界ではたくさんあります。C++11 のスキルは、今後の C++1y (おそらく C++14) 標準にもスムーズに変換されます。

std::vectorとの主な違いstd::arrayは、動的 (サイズと割り当て) と静的ストレージです。したがって、常に、たとえば 4x4 のマトリックス クラスが必要な場合は、std::array<float, 4*4>問題なく実行できます。

これらのクラスはどちらも.data()、互換性のあるポインターを生成するメンバーを提供します。ただし、std::vector<std::vector<float>>連続し16*sizeof(float)たメモリを占有しないことに注意してください (動作しv[0].data() ません)。動的なサイズのマトリックスが必要な場合は、singlevectorを使用してサイズを変更しwidth*heightます。

要素へのアクセスが少し難しくなるため (v[width * y +x]またはv[height * x + y])、行/列のペアで任意のフィールドにアクセスできるようにするラッパー クラスを提供することをお勧めします。

Cスタイルの配列についても言及したので。std::array同じタイプのストレージを処理するためのより優れたインターフェイスを提供するため、優先する必要があります。上の静的配列で得られるものは何もありませんstd::array

于 2013-09-18T09:55:01.093 に答える
16

これは質問への非常に遅い返信ですが、誰かがこれを読んだ場合、行列を「ベクトルのベクトル」として実装することはほとんどないことを指摘したいだけです。その理由は、行列の各行がヒープ上のランダムな場所に格納されるためです。これは、行列演算が大量のランダム メモリ アクセスを実行してキャッシュ ミスにつながることを意味し、実装が大幅に遅くなります。

つまり、パフォーマンスを気にする場合はarray/std::array/std::vector、 sizeの を割り当ててrows * columnsから、整数のペアを配列内の対応する要素に変換するラッパー関数を使用します。マトリックスの行への参照を返すなどのサポートが必要でない限り、これらのオプションはすべて問題なく機能するはずです。

于 2015-07-12T19:53:12.013 に答える