2010-12-30 5 views
4

私はこのような例を参照しています 私は、ベクトルの要素である「入力」を解析する関数を持っています。これらの要素に特殊なプロパティがある場合は、その値をベクトル 'output'に格納します。 問題は、「出力」に格納する必要がある要素の数がわからないということです。そのサイズはわかりません。 私はループを持っています。その中で、私はベクトルの周りを行き来し、インデックスを通して「入力」します。私はこのような文を通じて「ouputを」は、このベクトルのいくつかの要素が「入力」の値をキャプチャし、特別な考慮し、これをベクターに格納された場合:Matlab:動的ベクトルを実装する方法

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

問題は、私は私ドン場合はエラーを取得するということです以前は "出力"を宣言していません。私は興味がない入力からの値を格納するので、出力=入力としてループに達する前に "出力"を宣言したくないので、保存したすべての値を削除する方法を考えるべきです私に関連しています。 誰かがこの問題について私を照らしてくれますか? ありがとうございます。

+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

を持っている場合、私は知りませんが

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

ためのループ内のロジックはどのように複雑なのですか?

それはシンプルだ場合は、このような何かが働くだろう:

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

自明な解がある:これは良いパフォーマンスやない

+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)、パフォーマンスが大幅に低下することに注意してください。

関連する問題