我有一个存储为动态数组的矩阵,即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列)
仔细看一下,如果有什么问题请告诉我。