如何在MATLAB中有效地比较两个向量中的元素而不使用循环?

时间:2016-09-19 15:41:08

标签: matlab vectorization

假设我有一个矩阵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列包含A第2列中找到的相关最小权重。

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

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

1 个答案:

答案 0 :(得分:5)

您可以使用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));