2012-07-24 4 views
1

나는 행렬 A=(n,m)을 가지고 있으며 열을 하나씩 스캔해야하며 열 요소의 합계가 임계 값보다 큰 경우 열을 새 행렬에 넣어야합니다 B=(n,?). 분명히가능한 한 적은 수의 루프에 데이터를 동적으로 추가

B=[1 3 
    3 1 
    4 8] 

, 내가 따라서 첫 번째 루프에서, 나는 그 값이 경우 열의 요소의 합을 확인 B에 얼마나 많은 열을 모르는 :

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

threshold=6 

그리고 그 결과로

가 임계 값보다 큰 경우 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

+1

예? 내 코드는 mex 파일 (matlab)에 래핑되어야합니다. –

+1

나는 아무것도 가지고 있지 않다 (MATLAB에 대한 경험이 없다). 아마도 원래 질문에 추가하고 싶은 세부 사항 일 것입니다. – Ashe

답변

0

링크 된 목록을 사용할 수 있습니다. 따라서 요소 (이 경우 임계 값을 충족하는 모든 열의 인덱스)를 추가 할 때마다주기가 끝나면 할당해야 할 메모리 양을 알 수 있습니다 열을 간단한 2 차원 배열에 넣습니다.

최소한이 방법으로 재 할당해야합니다.

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

응답으로 코드를 게시하지 마십시오. 코드가 훌륭하지만 다른 솔루션보다이 코드를 제안한 이유, 도착한 방법 및 작동 방식을 설명 할 때 답이 더 도움이 될 것입니다. –

+0

이 코드의 의도는 명백합니다. – BLUEPIXY

+1

네, 당신과 저는 분명합니다.하지만 학습자가 텍스트를 더 쉽게 읽을 수 있습니다. "먼저 행렬 전체에 충분한 메모리를 할당하고 허용되는 열 수를 추적하는 변수를 만든 다음 이전 행렬의 열을 반복합니다. 각 열을 요약 할 때 모든 값을 현재 열에 복사합니다. 합계가 충분하지 않으면 현재 열을 업데이트하지 말고 다음 열이 이전 열을 덮어 씁니다. 이렇게하면 2 단계 접근 방식을 피할 수 있고 코드가 빨라지므로 마지막으로 수용 할 수있는 열에 맞게 재 할당하십시오. " –

관련 문제