gpt4 book ai didi

matlab - 在 MATLAB 中有效地循环向量

转载 作者:行者123 更新时间:2023-12-02 11:47:54 25 4
gpt4 key购买 nike

在 Matlab 中我们有这样的场景:

v =[1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 .... N N N N];

其中 v 中的元素始终按从 1 到 N 递增的顺序排列,并且我们知道 N 的值。我们想要计算 v 中“1”、“2”的数量。

当然我们可以使用如下循环:

for i =  1 : N
% method A
tic
ind = find(v == i)
---> do sth with ind
t1 = toc;

% method B
tic
ind = v(v == i)
---> do sth with ind
t2 = toc;

% method C
tic
ind = ismember(v , i)
---> do sth with ind
t3 = toc;


end

每种方法所需的时间大致等于 $t1=0.02 秒$、$t2=0.02 秒$ 和 $t3=0.03 秒$。在我的实际工作中,N 很大,整个循环需要 2 -3 小时!

您是否有任何想法可以增加执行此过程的时间?任何想法表示赞赏。

最佳答案

具体情况:排序输入,仅计数

如果您希望获得计数,这里可以建议一些方法。

方法#1:

accumarray(v(:),1)

方法#2:

diff([0 find([diff(v) 1])])

方法#3:

histc(v,1:max(v))

就性能而言,我会押注于 diff,然后押注于 accumarray,最后押注于 histc

<小时/>

一般情况:未排序的输入、计数和索引

对于输入向量 v 未排序的一般情况,您可能还需要与每组相同数字对应的索引,这是将索引存储在元胞数组中的一种方法 -

[~,sort_idx] = sort(v);
sorted_v = v(sort_idx);
counts = diff([0 find([diff(sorted_v) 1])])
indices_per_grp = mat2cell(sort_idx,1,counts);

示例运行 -

v =
2 1 3 3 2 4 1 2 1 1 4 3 4 3
counts =
4 3 4 3
indices_per_grp{1} =
2 7 9 10
indices_per_grp{2} =
1 5 8
indices_per_grp{3} =
3 4 12 14
indices_per_grp{4} =
6 11 13

关于matlab - 在 MATLAB 中有效地循环向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33814382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com