我是Matlab的新手,我觉得使用数组完全不知所措。在Matlab中最有效的以下C ++代码实现是什么?
A = std::vector<double>();
for (int i = 0; i < 100; i++) {
if (complicatedBoolFunction(i)) {
A.push_back(i);
}
}
编辑:效率我的意思是尽可能少地使用资源来增加数组A - 也就是说,避免将其复制粘贴到临时内存中
答案 0 :(得分:5)
你可以做2种方式
预分配最大大小,并删除未使用的元素。这具有在经常满足条件的情况下预分配存储器的优点......
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
追加到数组。如果不太可能追加,这可以避免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
更好的,更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