gpt4 book ai didi

matlab - 如何在不使用循环的情况下有效地比较 MATLAB 中两个向量中的元素?

转载 作者:太空宇宙 更新时间:2023-11-03 20:20:13 25 4
gpt4 key购买 nike

假设我有一个矩阵 A,其第一列包含具有重复项的项目 ID,第二列包含它们的权重。

A= [1   40
3 33
2 12
4 22
2 10
3 6
1 15
6 29
4 10
1 2
5 18
5 11
2 8
6 25
1 14
2 11
4 28
3 38
5 35
3 9];

我现在想找出 A 的每个实例的差异及其关联的最小权重。为此,我制作了一个矩阵 B,其第一列包含 A 第 1 列的唯一 ID,其第 2 列包含从第 2 列找到的相关最小权重A

B=[1    2
2 8
3 6
4 10
5 11
6 25];

然后,我想在 A 的第 3 列中存储每个条目的差异及其关联的最小权重。

A= [1   40  38
3 33 27
2 12 4
4 22 12
2 10 2
3 6 0
1 15 13
6 29 4
4 10 0
1 2 0
5 18 7
5 11 0
2 8 0
6 25 0
1 14 12
2 11 3
4 28 18
3 38 32
5 35 24
3 9 3];

这是我为此编写的代码:

for i=1:size(A,1)
A(i,3) = A(i,1) - B(B(:,1)==A(i,2),2);
end

但是这段代码需要很长时间才能执行,因为它需要在每次循环遍历A时都遍历B。也就是说,它的复杂度为 size(A) x size(B)。有没有更好的方法在不使用循环的情况下执行此操作,执行速度更快?

最佳答案

您可以使用 accumarray 首先为 A 第一列中的每个唯一值计算 A 第二列中的最小值.然后,我们可以使用 A 的第一列对结果进行索引,并与 A 的第二列进行比较以创建第三列。

% Compute the mins
min_per_group = accumarray(A(:,1), A(:,2), [], @min);

% Compute the difference between the second column and the minima
A(:,3) = A(:,2) - min_per_group(A(:,1));

关于matlab - 如何在不使用循环的情况下有效地比较 MATLAB 中两个向量中的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39577048/

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