【问题标题】:How do I average elements of a matrix according to an identity matrix?如何根据单位矩阵平均矩阵的元素?
【发布时间】:2015-03-04 06:59:10
【问题描述】:

我有一个 333x1 的值向量(“数据”),向量中的每个单元格对应于 13 个子类别中的 1 个范围。这些子类别中的每一个的身份都存储在一个单独的身份矩阵('id')中。我想计算原始数据矩阵中具有相似标识的值的总和。

例如在这个例子中假装 'data' 和 'id' 是 8x1 向量

数据 = [1;1;1;0;0;0;1;1]

id = [1;2;1;2;3;3;1;3]

  • id 1 的总和:1 + 0 + 1 + 0 + 0 + 0 + 1 + 0 = 3

  • id 2 的总和:0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 = 1

  • id 3 的总和:0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 = 1

我确信有一个非常简单的解决方法,但是我似乎无法解决。

感谢您的宝贵时间

苹果机

【问题讨论】:

    标签: matlab


    【解决方案1】:

    一个简单的解决方案是:

    numCategories = 13;
    totals = zeros(numCategories,1);
    
    for idnum = 1:numCategories
       totals(idnum) = sum((id==idnum).*data);
    end
    

    编辑:正如 knedlsepp 在 cmets 中指出的那样,accumarray 函数在一行中完全完成了上述代码的工作。

    accumarray(id,data);
    

    【讨论】:

    • 感谢您的帮助。我还有另一个转折点......如果我需要计算数据矩阵的相似元素的总和怎么办。所以,如果数据 = [2;1;1;0;0;0;2;2]
    • @MacShine 我不知道扭曲是什么。仅仅是data 矩阵允许有 2 的事实吗?
    • 是的。抱歉,我的电脑决定在我完成之前删除我的帖子。这个想法是我需要为数据中的每个唯一元素创建不同的总和。数据中的值范围为 0 - 5。
    • 那么data 中的元素既可以用作值又可以用作ID?在这种情况下,只需在上面的代码中使用data==idnum
    • accumarray(id,data) 也是一种选择。
    猜你喜欢
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多