4

我指的是这样的例子,我有一个函数来分析向量“输入”的元素。如果这些元素具有特殊属性,我将它们的值存储在一个向量“输出”中。问题是在乞讨时我不知道它需要存储在“输出”中的元素数量,所以我不知道它的大小。我有一个循环,在里面我绕过向量,通过索引“输入”。当我考虑这个向量的特殊元素时,它会捕获“输入”的值,并通过这样的句子将其存储在向量“输出”中:

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

问题是如果我之前没有“声明”“输出”,我会得到一个错误。我不喜欢在到达循环之前“声明”“输出”作为输出 = 输入,因为它存储了我不感兴趣的输入值,我应该想办法删除我存储的所有值与我有关。有人告诉我这个问题吗?谢谢你。

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)) = [];

有两种选择

如果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 回答