簡體   English   中英

C#:是否可以使用Buffer.BlockCopy創建矩陣的轉置

[英]C#: Is it possible to create a transpose of a matrix using Buffer.BlockCopy

我正在使用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
    );
}

我嘗試了多種變體,並且一直盯着它看了一段時間。 任何建議將不勝感激。 我寧願不使用循環。 感謝您的任何建議或幫助。

問題似乎是我需要遍歷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
    );
}

如果按這樣的行順序存儲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列的數組,第三行( i=2 )和第五列( 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

因此,要創建AB[k_t] = A[k]的轉置

for(k=0; k<N*M; k++)
{
    B[N*(k%M)+(k/M)] = A[k];
}

現在,將其與BlockCopy()一起使用, BlockCopy() sizeof(double)進行縮放即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM