【问题标题】:Is there a one-liner to find the minimum of unique entities from a matrix of multiple instances of each item?是否有一种方法可以从每个项目的多个实例的矩阵中找到最小的唯一实体?
【发布时间】:2016-09-05 18:33:12
【问题描述】:

比如说,我有一个矩阵 A,它有 2 列 - 第 1 列包含项目 ID,第 2 列包含它的权重:

A = [
3   5
2   3
2   5
1   4
3   4
2   6
1   9
3   2 ];

我希望输出如下:

items = [
1   4
2   3
3   2];

为此我要编写的代码是:

items(:,1)=unique(A(:,1));
for i=1:size(items,1)
    temp=A(A(:,1)==items(i,1),:);
    items(i,2)=min(temp(:,2));
end

items 矩阵是此处所需的输出。

我想知道是否有在 MATLAB 中执行此操作的单行代码。

【问题讨论】:

    标签: matlab matrix


    【解决方案1】:

    假设您的商品 ID 是从 1 开始的整数,您可以使用 accumarray

    accumarray(a(:,1), a(:,2), [], @min);
    

    【讨论】:

    • @Shai 感谢您的解决方案。您的代码会立即执行,而我的代码大约需要一分钟才能完成执行。你知道为什么会有这么大的时差吗?
    • 你正在运行 unique 对数组进行排序 - 它需要 O(nlogn)。然后你再次遍历A 中的所有项目,并将每个项目与items(i,1) 进行比较,这需要 O(n^2)。使用 accumarray 我相信是 O(n)。
    • @Shai unique 立即结束。它的 for 循环需要时间。是的,它可能是因为你提到的 O(n^2) vs O(n) 的事情。不过,仍在尝试理解您的代码,accumarray 的工作原理:-)
    • @Kristada673 您可以使用profile 查看运行时细分。您还可以点击 accumarray 文档的链接来解释它的工作原理。
    • @Kristada673 你为什么运行你的for 循环从1 到size(A,1)?仅沿着ìtems`的长度运行就足够了
    【解决方案2】:

    使用sortrows:

    B = sortrows(A);
    A_min = B([true; diff(B(:,1))~=0], :)
    
    A_min =
    
         1     4
         2     3
         3     2
    

    sortrows 根据第一列升序对矩阵进行排序,然后是第二列。使用这个新的排序向量并提取第一行以及第一列发生变化的所有行(1、2、3)。

    [true; diff(B(:,1))~=0] 是一个包含布尔值[true false false true ...] 的向量。 true 指示第一列中的元素发生变化的位置。这用作索引原始数组的逻辑映射。

    你应该知道:

    x = [1 2 3 4];
    idx = [true false false true];
    x(idx) = 
         1    4
    

    【讨论】:

    • @Kristada673 尝试搜索函数diff。我相信这会解决你的问题
    【解决方案3】:

    如果您可以访问图像处理工具箱,您可以这样做:

    [unique(A(:,1)),[regionprops(A(:,1),A(:,2),'MinIntensity').MinIntensity]']
    

    【讨论】:

    • @Shai 请告诉我哪部分代码不能在Matlab中运行
    • 在matlab中,不能引用函数输出:不能访问regionprops(...)的隐式输出的.MinIntensity字段。您必须将输出分配给一个变量,然后才能访问该结构数组的字段
    猜你喜欢
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 2016-01-03
    • 1970-01-01
    相关资源
    最近更新 更多