2013-06-07 2 views
1

Matlab의 for 루프 수가 달라졌습니다. 몇 가지 다른 데이터 폴더를 생성했습니다. 각 파일에는 .mat 파일이 몇 개 있습니다. 필자가해야 할 일은 해당 폴더에있는 파일 (가능한 한 같은 폴더에있는 파일이 아님)에서 가능한 모든 조합을 생성하는 것입니다. 그래서 기본적으로 알고리즘은 다음과 같습니다 Matlab의 다양한 중첩 루프 수

For i = 1: number of files in folder 1 
    For j = 1:number of files in folder 2 
    ............................ 
     For m = 1: number of files in folder n 
     Read file i in folder 1 
     Read file j in folder 2 
     ...................... 
     Read file m in folder n 
     Result file = sum of data in those files %at last we have n-Dimension matrix 

     end; 
    end; 
end; 

우리는 폴더 수를 해결할 수있는 경우

이 완료되지만 폴더의 수는 입력 매개 변수에 따라 달라집니다, 그래서 적절한 해결책을 찾을 수 없습니다. 또한 재귀 알고리즘에 대해 읽었지만이 방법은 분명하지 않습니다. 예 : 재귀 알고리즘 사용 :

저는 각 폴더에있는 파일 수를 나타내는 벡터가 A = [2,3,4] (3 폴더)입니다.

Function Recursive (n, A) % n = 3 
    if (n>1) 
    Recursive (n-1, A) 
    else 
    for i = 1: A(n) 
    Read file i in folder n; 
    end; 
    end 

여기서 우리는 이전 변수 (j, k ..)를 알 수 없으므로 쓸모가 없습니다.

제발 나에게 몇 가지 제안.

+0

폴더 구조는 어떻게 구성되어 있습니까? 'Main> folder01, folder02' 등 ... 아니면 중첩 된 폴더를 가지고 있습니까 (예 :'main> folder01> folder0101; main> folder02, main> folder03> fodler0301> folder030101' 등 ...? 전자의 경우에는 단일 루프이면 충분합니다. – Oleg

+0

많은 반복적 인 독서처럼 보입니다. 한꺼번에 읽을 수있는 데이터가 너무 많습니까? 그런 다음 계산 루프를 수행합니까? –

+0

안녕하세요, 구조는 메인 -> folder01, folder02 ....., 폴더 n입니다. 폴더 수는 가변적이며 각 폴더의 파일 수도 다양합니다. 나는이 정보를 저장하므로 (예 : A = [2, 4,5]) 폴더 1에 2 개의 파일이 있고 폴더 2에 4 개의 파일이 있다는 것을 의미합니다. –

답변

0

첫 번째로, 읽기는 low입니다. 당신은 절대적으로해야하는 것 이상으로해서는 안됩니다. 모든 것을 메모리에 자유롭게 저장할 수 있다면 그렇게하십시오. 할 수는 없지만 실제로 파일의 데이터를 합산하는 것과 같은 작업을 수행하는 경우 각 파일의 합계를 계산하여 저장하십시오 (폴더 당 하나의 벡터가있는 셀에있는 것으로 추정 됨). 재귀 적으로 함수를 호출하는 경우 전체 통계 파일이 아닌 요약 통계로 작업 할 수도 있습니다. 가장 안쪽 루프의 모든 반복에 대해 새 함수에 전체 .mat 파일을 부어 넣고 싶지는 않습니다.

실제 루프에서는 카운터가 1에서 각 폴더에있는 파일 수의 곱으로가는 메인 루프를 사용하는 것이 좋습니다. 그 루프 안에서, 나는 내가 무엇을 업데이트 하는지를 테스트 할 것이다. 이 SumsOfMatFiles 가정

BigOutputArray=zeros(A); 
P=prod(A); 
cumprod=cumprod(A); 
S=zeros(n,1);  
currindex=num2cell(ones(n,1)); 
for ii=1:n 
    S(ii)=SumsOfMatFiles{ii}(1); 
end 
for ii=1:prod(A) 
    jj=max([0,find(~mod(ii,P))])+1; 
    thissum=sum(S); 
    BigOutputArray(i)=thissum; 
    S(jj)=SumsOfMatFiles{jj}(currindex(ii)+1); 
    currindex(ii)=currindex(ii)+1; 
end 

같은 뭔가 합을 포함하는 n 개의 배열을 포함하는 좋은 세포이며, .mat 파일 사이의 상호 작용이 없다. 그렇지 않은 경우, S를 .m 세트의 파일 내용이 포함 된 셀 배열로 대체하고, 필요한 경우 S {:}를 사용하여 sum (S)를 적절한 함수로 바꿉니다.

0
I가 m 동적 중첩 루프 변환 대신 오전

길이 n 각각 하나를 조합 m*n리스트에

for i1=v{1} 
    ... 
     for im=v{m} 
     f(i1,...,im)=F(i1,...,im); 
     end 
    ... 
end 

:

I=combvec(v{1},...,v{m}); 
for i=I 
    f(i)=F(I(i)); 
end 
f=reshape(F,m,n); 

vm와 가변 크기 셀인 요소, 루프의 요소를 정의합니다. v{i}은 i 번째 루프에 대한 인덱스 행 벡터입니다.

루프 인덱스는 반드시 고정 길이 n 일 수 없습니다. 이 코드는 볼 수 있듯이이 코드와 동일합니다.

두 결과 모두 행렬 fm이고 n입니다.

중앙 비용은 항상 동적 인 인수를 취해야하는 F 함수를 평가하는 것입니다.

두 루프 모두 복잡도가 O (n^m)이지만 동적 루프는 재귀없이 알려진 최신 방법으로 프로그래밍 할 수 없습니다.

인덱스 I 및 동적 루프를 처리하고 저장하는 데 드는 비용은 함수 F을 비교할 때보 다 중요하지 않습니다.