1

我有一个矩阵A=(n,m),我需要一一扫描它的列,如果一列元素的总和大于阈值,则将该列放入一个新矩阵B=(n,?)中。

A=[1 2 3
   3 1 1
   4 2 8]

threshold=6

结果:

B=[1 3
   3 1
   4 8]

显然,我不知道 中有多少列B,因此在第一个循环中,我检查列中元素的总和,然后如果该值大于阈值,我重复循环以将列附加到Barealloc中。

okcol=0;
double *B = malloc(n*sizeof(double));
for (col=0;col<m;col++){
  sum=0;
  for (row=0;row<n;row++){
    sum+=A[row+col*n];
    if(sum>threshold){
      B = realloc(B, (okcol+1)*n*sizeof(double));
      for (row2=0;row2<n;row2++){
        B [okcol*n+row2] = A[row2+col*n];
      }
      okcol++;
    }  
  }
}          

B如果总和小于阈值,是否有一种方法可以自动添加元素并“删除”它们?换句话说,我想避免最后一个循环。

4

2 回答 2

0

您可以使用链表,因此每次您只需添加一个元素(在本例中为满足阈值的每一列的索引)并且在循环结束时您知道必须分配多少内存才能放入列中成一个简单的二维数组。

您至少会以这种方式进行大量重新分配。

于 2012-07-24T11:35:13.067 回答
0
double *B = (double*)malloc(n*m*sizeof(double));
int c,r,okcol=0;
for(c=0;c<m;++c){
    for(sum=0, r=0;r<n;++r){
        sum+=(B[r+okcol*m]=A[r+c*m]);
    }
    if(sum > threshold)
        ++okcol;
}
B=(double*)realloc(B, okcol*m*sizeof(double));
于 2012-07-25T16:57:05.707 回答