我正在使用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
);
}
我尝试了很多变化,我一直在盯着这个。任何建议将不胜感激。我宁愿不使用循环。感谢您提供的任何建议或帮助。
问题似乎是我需要遍历所有N行X而在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
);
}
答案 0 :(得分:0)
如果按{
这样的行顺序存储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
。例如,i=2
列的数组的第3行(j=4
)和第5列(M=10
)为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
所以要创建A
转置B[k_t] = A[k]
,你需要
for(k=0; k<N*M; k++)
{
B[N*(k%M)+(k/M)] = A[k];
}
现在要将其与BlockCopy()
一起使用,您只需按sizeof(double)
进行缩放。