【问题标题】:How to efficiently compare elements in two vectors in MATLAB without using loops?如何在不使用循环的情况下有效地比较 MATLAB 中两个向量中的元素?
【发布时间】:2016-09-19 15:41:07
【问题描述】:

假设我有一个矩阵 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

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

【问题讨论】:

    标签: matlab vectorization


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2013-10-24
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 2013-10-05
      • 2013-02-24
      相关资源
      最近更新 更多