MATLAB:動的ベクトルを実装する方法
-
14-10-2019 - |
質問
このような例を参照しています。ベクトル「入力」の要素を分析する機能があります。これらの要素に特別なプロパティがある場合、私はその値をベクトル「出力」に保存します。問題は、物ggingいで、「output」に保存する必要がある要素の数をわからないので、そのサイズはわからないということです。ループがあります。内部では、インデックスを介してベクトルの周りを「入力」します。このベクトルの特別な要素を考慮すると、「入力」の値をキャプチャし、このような文を通してベクトル「ouput」に保存されます。
For i=1:N %Where N denotes the number of elements of 'input'
...
output(j) = input(i);
...
end
問題は、以前に「出力」を「宣言」しないとエラーが発生したことです。ループに到達する前に出力=入力として「出力」を「宣言」したくない。私に関連しています。誰かがこの問題について私を照らしますか?ありがとうございました。
解決
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
他のヒント
些細な解決策は次のとおりです。
% if input(i) meets your conditions
output = [output; input(i)]
これが良いパフォーマンスを持っているかどうかはわかりませんが
もしも N
それがあなたのメモリの問題を引き起こすように大きすぎないので、あなたは事前に割り当てることができます output
同じサイズのベクトルに input
, 、およびループの最後にあるすべての役に立たない要素を削除します。
output = NaN(N,1);
for i=1:N
...
output(i) = input(i);
...
end
output(isnan(output)) = [];
2つの選択肢があります
もしも output
のサイズが割り当てられれば大きすぎます N
, 、またはあなたがのサイズの上限を知らなかった場合 output
, 、次のことができます
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) = [];
最後に、nが小さい場合、電話するのはまったく問題ありません
output = [];
for i=1:N
...
output = [output;input(i)];
...
end
Nが大きくなった場合(たとえば> 1000)、パフォーマンスは劇的に低下することに注意してください。