【问题标题】:Matlab: how to implement a dynamic vectorMatlab:如何实现动态向量
【发布时间】:2010-12-30 14:34:21
【问题描述】:

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

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

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

【问题讨论】:

标签: matlab dynamic vector language-implementation


【解决方案1】:

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)]
    

    虽然不知道这个性能好不好

    【讨论】:

    • 需要在开头加上output = [];。而且性能很差。
    • 所以当你不关心性能时这是一个很好的解决方案:-)
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多