我有一个矩阵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
中的元素,如果总和小于阈值,则“删除”它们?换句话说,我想避免最后一个循环。
答案 0 :(得分:0)
您可以使用链接列表,因此每次只添加一个元素(在这种情况下是满足阈值的每列的索引),并且在周期结束时,您知道需要分配多少内存来放置在列中成为一个简单的二维数组。
你至少会以这种方式重新分配。
答案 1 :(得分: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));