X などの double 値のベクトル (1D 配列) があります。Y の最初の行が X の転置と同じになるように、この値のベクトルを Y などの行列 (2D 配列) にコピーする必要があります。行は X を 1 値左にシフトしたものと同じで、Y の 3 行目は X を 2 値左にシフトしたものと同じです。
例えば、
X = { 1.0, 2.0. 3.0, 4.0, 5.0 }
そして私は必要です
Y = 1.0 2.0 3.0 4.0 5.0
2.0 3.0 4.0 5.0 0.0
3.0 4.0 5.0 0.0 0.0
4.0 5.0 0.0 0.0 0.0
5.0 0.0 0.0 0.0 0.0
しばらく前に、Mathew Finlay が値型の 1D 配列を 2D 配列にコピーするためのコードを投稿しました。次のようにコードを変更しました。
for (int targetRow = 0; targetRow < N; targetRow++)
{
Buffer.BlockCopy
(
X, // 1D source array
0, // source array offset
Y, // 2D target (destination) array
targetRow * Y.GetLength(targetRow) * sizeof(double), // target array offset
X.Length * sizeof(double) // count
);
}
これがうまくいくかどうか、さらに重要なことに、これがこれを行うための最良の方法であるかどうかはわかりません. これはより大きなコードの一部であり、ベクトル X と行列 Y が非常に大きくなる可能性があるため、この部分は高速かつ効率的である必要があります。
また、物事をもう少し複雑にするために、ベクトル X の全長 (すべての値) を必要とせず、その一部のみを必要とする場合があるため、行列 Y は N x M (M <= N) になる可能性があります。上記のコードでこれを処理します。
あなたが提供できるかもしれない助けや提案を事前に感謝します.
編集: 興味のある方のために、パフォーマンス結果をいくつか示します。
ここで提案されている 2 種類のコード (ループと Buffer.BlockCopy) でいくつかの速度テストを実行したところ、驚くべき結果が得られました。Buffer.BlockCopy を BC として指定し、ループを L として指定します。100x100 マトリックスの場合、BC = 00:00:00.0000293 および L = 00:00:00.0000710 です。最後に、1000x1000 マトリックスの場合、BC = 00:00:00.0065340 および L = 00:00:00.0138396 です。そのため、Buffer.Block のコピーは、行列が小さい場合でもループよりも優れているようです。これを Win 7 Ultimate (64) マシンで実行しました。