2012-07-24 52 views
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,因此在第一循环中,我检查元素之和在一列,那么如果该值大于阈值I,重复将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

你是否有理由自己完成所有这些工作并且没有利用现有的库? – Ashe 2012-07-24 11:50:54

+1

例子?我的代码必须包装在一个mex文件(matlab)中。 – 2012-07-24 12:37:10

+1

我没有(没有MATLAB的经验)。这可能是您想要添加到原始问题的详细信息。 – Ashe 2012-07-24 13:17:43

回答

0

你可以使用一个链表,所以每次你只需要添加一个元素(在这种情况下,每一个达到阈值列的索引),并在周期结束时,你知道你有多少内存分配给将列放入一个简单的二维数组中。

这样你至少会有很多重新分配。

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)); 
+0

请不要只发布代码作为答案。代码很棒,但如果你描述为什么你建议使用其他解决方案的代码,你如何实现它以及它是如何工作的,你的答案会更有帮助。 – 2012-07-25 17:04:30

+0

这段代码的意图很明显。 – BLUEPIXY 2012-07-25 17:09:55

+1

是的,对你而言,这很明显,但学习者阅读文字肯定更容易。 “首先,为整个矩阵分配足够的内存,创建一个变量来跟踪可接受的列的数量,然后遍历旧矩阵中的列,当总结每列时,将每个值复制到当前列。总和不足,不更新当前列;让下一列覆盖旧列,这样就避免了两步法,并且导致代码更快,最后,重新分配以仅适合可接受的列。 – 2012-07-25 17:23:24