我正在使用Buffer.BlockCopy从一个向量(一维数组) 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
);
}我已经尝试了许多变体,我已经关注这个有一段时间了。任何建议都将不胜感激。我不喜欢使用循环。感谢您能提供的任何建议或帮助。
问题似乎是,我需要遍历X的所有N行,才能在Buffer.BlockCopy中创建转置,我需要在M行停止。
编辑:
我想我已经弄明白了: 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
);
}发布于 2013-11-14 07:36:10
如果按行顺序存储N×M矩阵,如下所示
A = [R1C1, R1C2, .. , R1CM, R2C1, R2C2, .. , R2CM, ... , RNC1, RNC2 , .. , RNCM]然后,在给定索引k=0..N*M-1的情况下,行号和列号通过
i = k/M; // row #
j = k%M; // col #要为序列矩阵生成索引k,您需要执行k = M*i+j。例如,包含M=10列的数组的第3行(i=2)和第5列(j=4)为k=10*2+4 = 24,因此A[24]应包含该值。
转置后的元素的索引是k_t = N*j+i = N*(k%M)+(k/M)。例如,使用上面的值(带有行N=7)可以得到k_t = 7*4+2 = 30
因此,要使用B[k_t] = A[k]创建A转置,您需要
for(k=0; k<N*M; k++)
{
B[N*(k%M)+(k/M)] = A[k];
}现在,要在BlockCopy()中使用它,您只需通过sizeof(double)对其进行缩放。
https://stackoverflow.com/questions/19966505
复制相似问题