我有一个存储为动态数组的矩阵,即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中所有这些列的完整数组。我在拉帕克和布拉斯图书馆工作。如果有一个内在的方式来做这个,那么请分享。

最佳答案

基本目标是将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才是最后一个,但这取决于您,您想要的列不需要作为指针传递,也不需要memcpy进行简单赋值。另外,所需的列索引将作为基于零的索引传递)
示例使用/输出
$ ./bin/array_idx_1d_as_2d
  2
  5
  8

(这是模拟3x3数组中9个值的第2列)
仔细看一下,如果有什么问题请告诉我。

08-26 05:43