Matlab:如何实现动态向量

4

我所指的例子是这样的:我有一个函数来分析向量“input”的元素。如果这些元素具有特殊属性,我会将它们的值存储在向量“output”中。问题是,在开始时,我不知道需要在'output'中存储多少个元素,因此我不知道其大小。我使用循环,通过索引遍历向量“input”。当我认为这个向量的某个元素是特殊的时候,通过以下语句捕获'input'的值,并将其存储在向量“output”中:

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

问题在于,如果我不先“声明”'output',就会出现错误。我不想在到达循环之前“声明”'output', 因为它会存储我不感兴趣的输入值,而我应该想办法删除所有对我无关的值。有人能解释一下这个问题吗?谢谢。

你会发现这些很有用:https://dev59.com/BnI_5IYBdhLWcg3wDOnW,https://dev59.com/fUzSa4cB1Zd3GeqPoq5u - Amro
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

2
微不足道的解决方案是:
% if input(i) meets your conditions
output = [output; input(i)]

尽管我不知道这个是否有良好的性能。

2
你需要在开头添加 output = [];。而且性能很差。 - mtrw
所以,当您不关心性能时,这是一个很好的解决方案 :-) - Nathan Fellman

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),性能会急剧下降。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接