首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#:可以使用Buffer.BlockCopy创建矩阵的转置吗

C#:可以使用Buffer.BlockCopy创建矩阵的转置吗
EN

Stack Overflow用户
提问于 2013-11-14 07:21:02
回答 1查看 627关注 0票数 1

我正在使用Buffer.BlockCopy从一个向量(一维数组) X创建一个N x M矩阵(2D数组)Y。

代码语言:javascript
复制
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来创建该矩阵的转置。我很难计算出代码的计数部分。

代码语言:javascript
复制
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需要如下所示:

代码语言:javascript
复制
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
    );
}
EN

回答 1

Stack Overflow用户

发布于 2013-11-14 07:36:10

如果按行顺序存储N×M矩阵,如下所示

代码语言:javascript
复制
A = [R1C1, R1C2, .. , R1CM, R2C1, R2C2, .. , R2CM, ... , RNC1, RNC2 , .. , RNCM]

然后,在给定索引k=0..N*M-1的情况下,行号和列号通过

代码语言:javascript
复制
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转置,您需要

代码语言:javascript
复制
for(k=0; k<N*M; k++)
{
    B[N*(k%M)+(k/M)] = A[k];
}

现在,要在BlockCopy()中使用它,您只需通过sizeof(double)对其进行缩放。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19966505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档