Matlab可变大小的数组

时间:2018-02-19 14:02:33

标签: arrays matlab

我是Matlab的新手,我觉得使用数组完全不知所措。在Matlab中最有效的以下C ++代码实现是什么?

A = std::vector<double>();

for (int i = 0; i < 100; i++) {
  if (complicatedBoolFunction(i)) {
    A.push_back(i);
  }
}

编辑:效率我的意思是尽可能少地使用资源来增加数组A - 也就是说,避免将其复制粘贴到临时内存中

2 个答案:

答案 0 :(得分:5)

你可以做2种方式

  1. 预分配最大大小,并删除未使用的元素。这具有在经常满足条件的情况下预分配存储器的优点......

    A = NaN(100,1)
    for ii = 0:99
        if rand > 0.5    % some condition
            A(ii+1) = ii; % some value
        end
    end
    A(isnan(A)) = []; % remove unused elements
    
  2. 追加到数组。如果不太可能追加,这可以避免A太大......

    A = []; % empty array
    for ii = 0:99
        if rand > 0.5 % some condition
            A(end+1, 1) = ii; % some value. Equivalent to 'A = [A; ii];'
        end
    end
    
  3. 更好的,更Matlab式的方法是对你的条件函数进行矢量化。这样就可以避免循环分配问题......

    ii = 0:99;
    A = ii(rand(100, 1) > 0.5);
    

    您可以使用任何您喜欢的布尔函数作为索引数组,只要它返回一个逻辑数组,其元素数量与您要编入索引的数组(此处为ii)或整数索引相同要选择的元素。

答案 1 :(得分:1)

这种C ++代码的最有效实现是

i = 0:99;
A = i(complicatedBoolFunction(i));

无论如何,你可以使用连接来增长一个数组,这通常不推荐,如下所示

A = [];

for i = 0:99
  if (complicatedBoolFunction(i))
    A = [A i];
  end
end

much more efficiently是这样的:

A = [];

for i = 0:99
  if (complicatedBoolFunction(i))
    A(end + 1) = i;
  end
end