Я использую Buffer.BlockCopy создать N х M матрицу (2D массив) Y из вектора (1D массив) X.C#: Можно ли создать транспонирование матрицы с использованием Buffer.BlockCopy
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
);
}
Я пробовал несколько вариантов, и я смотрел на это некоторое время. Любые предложения будут ценны. Я бы предпочел не использовать цикл. Благодарим вас за любые предложения или помощь, которые вы можете предоставить.
Проблема заключается в том, что мне нужно пройти все N строк X еще до создания транспонирования в Buffer.BlockCopy Мне нужно остановиться на M строк.
EDIT:
Я думаю, что я понял это: 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
);
}
Где находится 'XX'? – ja72
Приношу свои извинения, он должен читать X, а не XX. – PBrenek
Элементы в транспонированной матрице не расположены последовательно, поэтому вы не можете копировать с помощью «BlockCopy». – ja72