我有一个矩阵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中有多少列,因此在第一个循环中,我检查列中元素的总和,如果该值大于阈值,则重复循环,将B中的列附加到realloc
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中自动附加元素,并在总和小于阈值时“删除”它们?换句话说,我想避免最后一个循环。

最佳答案

您可以使用一个链表,因此每次您只需添加一个元素(在本例中是满足阈值的每一列的索引),并且在周期结束时,您就知道需要分配多少内存才能将列放入一个简单的二维数组中。
你至少可以用这种方式重新分配。

10-07 20:57