Buffer.BlockCopy を使用して、ベクトル (1D 配列) X から N x M 行列 (2D 配列) Y を作成しています。
double[] X = new double[N];
double[,] Y = new double[N, M];
for (int i = 0; i < N; ii++)
{
X[ii] = ii;
}
for (int targetRow = 0; targetRow < N; targetRow++)
{
Buffer.BlockCopy
(
X, // source vector
targetRow * sizeof(double), // source vector offset
Y, // target 2D array
(targetRow * M) * sizeof(double), // target array offset
((N - targetRow) > M ? M : (N - targetRow)) * sizeof(double) // count
);
}
Buffer.BlockCopy を使用して、その行列の転置も作成したいと思います。コードのカウント部分を理解するのに苦労しています。
double[,] YT = new double[M, N];
for (int targetRow = 0; targetRow < N; targetRow++)
{
Buffer.BlockCopy
(
X, // source vector
targetRow * sizeof(double), // source vector offset
YT, // target (destination) 2D array
(targetRow * N) * sizeof(double), // target array offset
(N - targetRow) * sizeof(double) // count
);
}
私はいくつかのバリエーションを試しましたが、しばらくの間これを見つめてきました. どんな提案でも大歓迎です。ループを使用しないことをお勧めします。あなたが提供できるかもしれない提案や助けをありがとう.
問題は、M 行で停止する必要がある Buffer.BlockCopy で転置を作成するために、X の N 行すべてをトラバースする必要があることです。
編集:
私はそれを理解したと思います: Buffer.BlockCopy は次のように読む必要があります:
double[,] YT = new double[M, N];
for (int targetRow = 0; targetRow < M; targetRow++)
{
Buffer.BlockCopy
(
X, // source vector
targetRow * sizeof(double), // source vector offset
YT, // target (destination) 2D array
(targetRow * N) * sizeof(double), // target array offset
(N - targetRow) * sizeof(double) // count
);
}