【问题标题】:Summing rows by index using accumarray使用 accumarray 按索引对行求和
【发布时间】:2015-04-27 21:15:19
【问题描述】:

我可以在不使用 for 循环的情况下对多个索引的行或列求和吗?

我有一个 n × n 矩阵M,它表示词汇术语的共现,其中 n 是词汇的长度。

我还有一个 n × n 逻辑掩码 L,它表示具有(单数、复数)形式的词汇对。例如,在伪代码中,L('octopus', 'octopuses') = True

我想将 M 中包含复数的任何对添加到包含相应单数的对的条目中。例如,在伪代码中,M_sum('octopus', 'swim') = M('octopus', 'swim') + M('octopuses', 'swim');

为了说明我到目前为止所做的尝试,让我们使用以下玩具数据。

vocabulary = {'octopus', 'octopuses', 'swim'};
% The co-occurrence matrix is symmetric
M = [0, 9, 3; 
     9, 0, 1;  
     3, 1, 0;];
% This example has only one plural singular pair
L = [0, 1, 0; 
     0, 0, 0; 
     0, 0, 0;];  

要查找单数到复数的对应关系,我可以使用 find

[singular, plural] = find(L == 1);

如果每个单数只有一个复数,将行或列相加很简单

M_sum = M;
M_sum(singular, :) = M_sum(singular, :) + M(plural, :);
M_sum(:, singular) = M_sum(:, singular) + M(:, plural);
% Remove diagonal entries
M_sum(eye(size(M))==1) = 0; 

但是,如果有多个复数对应一个单数,则不能使用这种方法。

例如,

vocabulary = {'octopus', 'octopuses', 'octopi', 'swim'};
M = [0, 9, 5, 3; 
     9, 0, 7, 1; 
     5, 7, 0, 11; 
     3, 1, 11, 0;];
L = [0, 1, 1, 0; 
     0, 0, 0, 0; 
     0, 0, 0, 0; 
     0, 0, 0, 0;];  

正确答案应该是

M_sum = [0, 16, 12, 15;
         16, 0, 7, 1;
         12, 7, 0, 11;
         15, 1, 11, 0;];

但使用上述方法返回

M_sum = [0, 16, 5, 14;
         16, 0, 7, 1;
         5, 7, 0, 11;
         14, 1, 11, 0;];

基本上,M_sum(singular, :) = M_sum(singular, :) + M(plural, :); 只使用最后一个 plural 索引。

我认为我需要在这里使用accumarray,但是我在制定正确的语句时遇到了一些麻烦,因为我有两个索引,pluralsingular。如果accumarray 不是正确的方法,也欢迎使用其他解决方案。

【问题讨论】:

    标签: matlab accumarray


    【解决方案1】:

    试试这个:

    M_sum = (L + eye(size(L,1)))*M;
    M_sum = triu(M_sum, 1);
    M_sum = M_sum + M_sum.';
    

    这是因为你已经有了矩阵L,所以矩阵乘法可以用来选择和求和M的行。


    在这里使用accumarray会有两个缺点:

    • 您需要应用findL 转换为索引,以用作accumarray 的第一个输入。再上一步。
    • accumarray 只能求和数字,不能求和行向量(它的第二个输入只能是列向量,不能是矩阵)。因此,您需要在 M 的每一列中调用一次 accumarray

    【讨论】:

    • 当然!矩阵乘法是对行求和。这对我有用,但我应该如何澄清我的问题,以便对未来的读者更有用?
    • @Cecilia 其实这个问题不是很清楚;只是很长。最初我并没有完全理解所有内容,因为我倾向于将问题阅读得太快。但这一切都在那里(我将编辑我的答案以删除该评论,因为它不再正确并且可能具有误导性)。所以我唯一的建议是稍微缩短问题的长度,if 可以在不失去任何意义的情况下完成。顺便说一句,你关心未来的读者真是太好了。这里的一些提问者似乎忘记了这一点! :-)
    猜你喜欢
    • 1970-01-01
    • 2018-10-13
    • 2021-12-29
    • 2015-02-27
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    相关资源
    最近更新 更多