从矩阵中提取特定列并将其作为新矩阵存储在C中

时间:2017-11-16 05:38:23

标签: c memcpy lapack blas

我有一个存储为动态数组的矩阵,即double * inputMat。我知道它可以提取任何特定列的行数和列数。现在问题是,我有一组要提取的列并存储到另一个动态数组中。这该怎么做?我正在写一部分代码供参考:

double *extractMatrix(double *inputMat,int rows, int *columnIndex, int columnTotal)
{      
   double *outputMat=malloc(sizeof(double)*rows*columnTotal);
   for(int i=0; i<columnTotal; i++)
       memcpy(outputMat, &inputMat[rows*columnIndex[i]],rows*sizeof(double));
   return outputMat;
}

columnIndex包含要从矩阵中提取的列的索引。 ColumnTotal是columnIndex数组的大小。但是,这只会将inputMat的一个特定列复制到outputMat中,然后可能会被覆盖。我想要columnIndex中所有这些列的完整数组。我正在使用lapack和BLAS库。如果有一种内置方式可以做到这一点,请分享。

1 个答案:

答案 0 :(得分:1)

您的基本目标是将数组double (实际上是指向double 的索引)索引,就像它是一个2D数组一样。您希望在提取某个列columnIndex的函数中执行此操作,并动态分配一块内存来保存构成该列的值(rows个值)并返回指向新的指针分配块。

您的方法是在正确的轨道上,您的索引就是关闭。在for循环本身处理索引要容易得多。基本方法是:

int n = 0;
for (int i = colindex; i < rows * cols; i += cols)
    output[n++] = input[i];

(假定列中的n < INT_MAX值 - 根据需要进行调整)

将一个小例子放在一起做你想要做的事情,你可以做以下的事情:

#include <stdio.h>
#include <stdlib.h>

int *getcol (const int *a, const int rows, const int col, const int ncols)
{
    int sz = rows * ncols,
        n = 0,   /* output index */
        *out = malloc (rows * sizeof *a);

    if (out)
        for (int i = col; i < sz; i += ncols)  /* index with loop vars */
            out[n++] = a[i];                   /* assign column values */

    return out;
}

int main (void) {

    int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 },
        rows = 3,                   /* simulate a 3x3 with 9 values */
        cols = sizeof a / (rows * sizeof *a),
        colidx = 1,                 /* zero based index of wanted column */
        *output = NULL;

    if ((output = getcol (a, rows, colidx, cols))) {
        for (int i = 0; i < rows; i++)
            printf (" %2d\n", output[i]);
        free (output);  /* don't forget to free memory */
    }

    return 0;
}

注意:>函数参数按照您列出的顺序排列 - 但使用较短的名称。最好是交换订单,以便columnIndex是最后一个,但是&#39 ;由您决定,您想要的列不需要作为指针传递,并且不需要memcpy简单赋值将起作用。此外,您想要的列索引作为零基于传递索引

示例使用/输出

$ ./bin/array_idx_1d_as_2d
  2
  5
  8

(这是9个值中模拟3x3数组的第2列)

仔细看看,如果您有任何问题,请告诉我。