1

行列がA=(n,m)あり、その列を 1 つずつスキャンする必要があり、列の要素の合計がしきい値よりも大きい場合は、列を新しい行列に入れますB=(n,?)

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

threshold=6

そして結果として:

B=[1 3
   3 1
   4 8]

明らかに、 の列数がわからないBため、最初のループで列の要素の合計を確認し、値がしきい値よりも大きい場合は、列をBaで追加するループを繰り返します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合計がしきい値未満の場合、要素を自動的に追加して「削除」する方法はありますか? つまり、最後のループは避けたいと思います。

4

2 に答える 2

0

リンクされたリストを使用できるため、要素 (この場合はしきい値を満たすすべての列のインデックス) を追加するたびに、サイクルの最後に、列に配置するために割り当てる必要があるメモリの量がわかります。単純な 2 次元配列に変換します。

この方法で、少なくとも多くの再割り当てを行います。

于 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 に答える