4

このような例を参照しています。ベクトルの要素「入力」を分析する関数があります。これらの要素に特別なプロパティがある場合、それらの値をベクター「出力」に格納します。問題は、「出力」に格納する必要がある要素の数がわからないため、そのサイズがわからないことです。私はループを持っています。内部では、インデックスを介してベクトル「入力」を回っています。このベクトルの特別な要素を考慮すると、「入力」の値をキャプチャし、次のような文を介してベクトル「出力」に格納されます。

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

問題は、事前に「出力」を「宣言」しないとエラーが発生することです。ループに到達する前に output = input として「出力」を「宣言」するのは好きではありません。これは、興味のない入力からの値を保存し、保存したすべての値を削除する方法を考える必要があるためです。私に関係があります。この問題について誰かが私を照らしてくれますか? ありがとうございました。

4

3 に答える 3

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
于 2010-12-30T15:55:02.490 に答える
2

簡単な解決策は次のとおりです。

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

これで性能が良いかどうかはわかりませんが

于 2010-12-30T14:39:02.140 に答える
1

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

于 2010-12-30T16:53:59.477 に答える