2010-12-30 4 views
4

나는이 같은 예제를 참조한다 나는 'input'이라는 벡터 요소를 분석하는 함수를 가지고있다. 이러한 요소에 특별한 속성이있는 경우 벡터의 값을 '출력'에 저장합니다. 문제는 구걸 할 때 '출력'에 저장해야하는 요소의 수를 알지 못하므로 크기를 알 수 없습니다. 나는 벡터 주위를 돌아 다니며 색인을 통해 '입력'되는 반복문을 가지고 있습니다. 나는 특별한 고려하면이 벡터의 일부 요소는 '입력'의 값을 캡처하고 그것은이 같은 문장을 통해 벡터 'OUPUT'에 저장할 수 :Matlab : 동적 벡터를 구현하는 방법

For i=1:N %Where N denotes the number of elements of 'input' 
... 
output(j) = input(i); 
... 
end 

문제는 내가 오류의 경우를 얻을 수 있다는 것입니다 I 돈 이전에는 '출력'을 선언하지 않았습니다. 나는 그것이 관심이없는 입력 값을 저장하기 때문에 출력에 입력하기 전에 "출력"을 선언하고 싶지는 않습니다. 그리고 저장하지 않은 값을 모두 제거해야한다고 생각해야합니다. 나에게 관련이있다. 누군가이 문제와 관련하여 나를 밝히는 사람이 있습니까? 감사합니다.

+0

유용한 정보는 다음과 같습니다. http://stackoverflow.com/questions/1548116/matrix-of-unknown-length-in-matlab, http://stackoverflow.com/questions/2480933/matlab-building-an -Array-while-looping – Amro

답변

7

for 루프의 논리가 얼마나 복잡를이 좋은 성능을 가지고 있는지 알고 여부하지 않지만? 간단 있다면

,이 같은 작동합니다 : 논리가 복잡하고 큰 벡터를 처리하는 경우

output = input (logic==true) 

또는, 내가 요소를 저장하거나 여부를 저장하는 벡터를 미리 할당 것 아니. 당신 메모리 문제가 발생할 것이다 그래야 너무 크지

N = length(input); %Where N denotes the number of elements of 'input' 
saveInput = zeros(1,N); % create a vector of 0s 
for i=1:N 
    ... 
    if (input meets criteria) 
     saveInput(i) = 1; 
    end 
end 
output = input(saveInput==1); %only save elements worth saving 
2

사소한 솔루션입니다 :

% if input(i) meets your conditions 
output = [output; input(i)] 

나는

+2

처음에'output = [];'를 추가해야합니다. 그리고 공연은 끔찍합니다. – mtrw

+0

성능에 신경 쓰지 않을 때 좋은 해결책입니다 :-) –

1

N 경우 input 같은 크기의 벡터에 output를 미리 할당하고, 모든 불필요한 요소를 제거 할 수 있습니다 여기에 몇 가지 예제 코드입니다 루프의 끝.

output = NaN(N,1); 
for i=1:N 
... 
output(i) = input(i); 
... 
end 
output(isnan(output)) = []; 

는 두 가지 대안

을있다가 N의 크기를 할당하거나 output의 크기의 상한을 알고하지 않은 경우, 당신은 할 수 있다면 output가 너무 큰 것입니다 경우 N이 작은 경우 마지막으로

lengthOutput = 100; 
output = NaN(lengthOutput,1); 
counter = 1; 
for i=1:N 
    ... 
    output(counter) = input(i); 
    counter = counter + 1; 
    if counter > lengthOutput 
     %# append output if necessary by doubling its size 
     output = [output;NaN(lengthOutput,1)]; 
     lengthOutput = length(output); 
    end 
end 
%# remove unused entries 
output(counter:end) = []; 

다음,

output = []; 
for i=1:N 
    ... 
    output = [output;input(i)]; 
    ... 
end 
전화를 완벽하게 괜찮습니다

N이 커지면 (예 :> 1000) 성능이 크게 떨어집니다.