1

我正在使用 Buffer.BlockCopy 从向量(一维数组)X 创建一个 N x M 矩阵(二维数组)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
    );
}
4

1 回答 1

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。例如,具有列的数组的第 3 行 ( i=2) 和第 5 列 ( )是,因此应该包含该值。j=4M=10k=10*2+4 = 24A[24]

转置元素的索引是k_t = N*j+i = N*(k%M)+(k/M)。例如,上面的值(带有 rows 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).

于 2013-11-13T23:36:09.543 回答