は、マトリックスは、このようなマトリックスの値をインデックス化するとM[row][column]
またはM[column][row]
ように行っているとき、それはほとんどのプログラマに、より直感的に理にかなってない例えば、以下の行と列の規則はありますか?
std::vector<std::vector<int>> M;
としてベクトルのベクトルとして構築考えてみましょうか?
は、マトリックスは、このようなマトリックスの値をインデックス化するとM[row][column]
またはM[column][row]
ように行っているとき、それはほとんどのプログラマに、より直感的に理にかなってない例えば、以下の行と列の規則はありますか?
std::vector<std::vector<int>> M;
としてベクトルのベクトルとして構築考えてみましょうか?
あなたはこれを自由に解釈することができます。外側のベクトルMが線のベクトルまたは列のベクトルとして見えているかどうかは疑問です。 M[i][j]
はのi
-stベクトルのj
-stアイテムを意味します。
もちろん、C++プログラマはM[row][column]
を使用する傾向があります。これは、2D配列を定義するときにデータがメモリに格納される方法に対応するためです。例えば:
int M[2][3] = { { 11,12,13}, {21,22,23} };
は、(カラムのような)を順次格納されている行の要素とメモリに格納される、及び行が格納された後、次の行を格納する:
11 12 13 21 22 23
かが」 dディスプレイの幅を固定します。
11 12 13
21 22 23
どのように配列にアクセスするかが重要です。シーケンシャルメモリアクセスは、一般に、非シーケンシャルメモリアクセスよりも高速である。したがって、あなたの配列と内部ループでアルゴリズムを実行している場合、 "行"は一定ですが、 "列"は繰り返し処理されているので、列要素をメモリ内で順次にしたいとします。あなたのベクトルベクトルの場合は、内部ベクトルを「列」にしたいので、それにはM[row][column]
という名前でアクセスします。
この質問は主に意見に基づいていると思います。つまり、行の主要な順序、すなわちM [r] [c]、または各行がメモリ内で連続していると考えられます。 – Brian
@Brianそれはタグ 'naming-conventions'に完全に適合しますが、私は持っているでしょう。私は行を最初にも持っているだろう。 –
数学的な観点からは、主に 'i-th' * row *と' j-th' * column *と考えられています。私は自分自身を含むほとんどのプログラマがそう思っていると思っていました.... BTWは、列のメジャーに行く必要があるかもしれない異なるアクセスパターンを持つ行列に関しては、これらの問題ではない – WhiZTiM