C使用指针从矩阵中提取数组

时间:2014-05-21 09:09:51

标签: c arrays pointers matrix indexing

我写了一个代码,我有一些数据存储在2d矩阵中:

 double y[LENGTH][2];

我有一个将1D数组作为输入的函数:

 double function(double* data)

我有兴趣将存储在此矩阵第一列中的数据传递给此函数。我怎么能用指针做到这一点? 我的函数是这样的(其中数组数据是包含LENGTH元素的double数组:

double data[LENGTH];

):

double function(double* data){
     double result=0;
     for(int i=0; i<LENGTH; i++){    
         result+=data[i];
     }
     return result;
}

我想将一行矩阵作为数据输入传递给此函数。

提前感谢大家!

2 个答案:

答案 0 :(得分:0)

如果将指针传递给2D矩阵的第一个元素,则可以将其作为1 D矩阵访问,因为元素是连续存储的:

double y[LENGTH][2];
x = function(y[0]);
...
double function(double* p) {
  int ii;
  double sum=0;
  for(ii=0; ii<2*LENGTH; ii++) sum += p[ii];
  return sum;
}

请注意,在这种情况下,访问元素的顺序是

y[0][0]
y[0][1]
y[1][0]
y[1][1]
y[2][0]
... etc

更新 - 您刚刚澄清了一下您的问题。如果只想访问一列数据,则需要跳过该数组。这意味着您需要知道第二维的大小。我会推荐这样的东西:

double function(double* p, int D2) {
  int ii;
  double sum=0;
  for(ii=0; ii<D2*LENGTH; ii+=D2) sum += p[ii];
  return sum;
}

你会用

来称呼它
x = function(y[colNum], numCols);

现在我们从某个位置开始,然后跳过前进D2元素来访问列中的下一个元素。

我不得不说这是相当丑陋的 - 这并不是真正意图使用C的方式。我建议将事物包装到一个可以干净利落地处理这些事情的类中 - 换句话说,切换到C ++(尽管可以编写纯C函数,然后躲避&#34;其中一些复杂性) 。您当然可以将数据复制到另一个内存块以使其连续,但这通常被认为是最后的追索权。

请注意,不要使用不可读/不可维护的代码......

进一步更新

根据您的评论,上述内容仍然不是您想要的。然后我推荐以下内容:

double *colPointer(double *p, int rowCount, int colCount) {
  double *cp;
  int ii;
  cp = malloc(rowCount * sizeof *cp);
  for(ii=0; ii<rowCount; ii++) cp[ii] = *(p + ii * colCount);
  return cp;
}

这将返回指向新创建的列副本的指针。你用

来称呼它
double *cc;
cc = colPointer(y[colNum], LENGTH, 2);
answer = function(cc);

现在您可以按照自己想要的方式使用cc。如果你必须多次这样做,你可能最好只转换一次整个数组 - 这样你就可以将指针传递给转置的一行并实现你的结果。您可以调整上面的代码来生成这样的转置。

请注意,如果您不使用此方法进行清理,则存在内存泄漏的风险。

答案 1 :(得分:0)

问题是你认为是行维吗? 通常第一个是行,第二个是cols。 这意味着您的double y[LENGTH][2];是一个包含LENGTH行和2列的矩阵。

如果这也是您的解释,那么您的问题的答案是&#34;您不能&#34;#34;因为记忆是这样排列的:

r0c0 r0c1 r1c0 r1c1 r2c0 r2c1 ...

您可以检索指向行但不是列的指针。

矩阵类通常以某种方式设计,存储行和列的步长,以便通过仔细设置它们,您可以在大数据块上构建子矩阵。

如果您打算执行更复杂的任务,可以查找opencv矩阵实现。

如果您可以更改要调用的函数的实现。您可以将其更改为接受行步骤(列数),这样它就不会将指针递增1来到达下一个元素,而是逐行递增指针。

作为替代方法,有一种明显的方法可以将所需的列复制到新数组中。

编辑:
修复内存布局图上的愚蠢错误