我有一个存储为动态数组的矩阵,即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库。如果有一种内置方式可以做到这一点,请分享。
答案 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列)
仔细看看,如果您有任何问题,请告诉我。