Matlab 使用accumarray按索引求和行数

Matlab 使用accumarray按索引求和行数,matlab,accumarray,Matlab,Accumarray,我可以在不使用for循环的情况下对多个索引上的行或列求和吗 我有一个n乘n的矩阵,M,它表示词汇术语的共现,其中n是词汇的长度 我还有一个n乘n的逻辑掩码,L,它表示词汇表对,其中词汇表对的形式为(单数、复数)。例如,在伪代码中,L('octopus','octopus')=True 我想将M中包含复数的任何对的条目添加到包含相应单数的对的条目中。例如,在伪代码中,musum('octopus','swim')=M('octopus','swim')+M('octopus','swim') 为了

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

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

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

我想将
M
中包含复数的任何对的条目添加到包含相应单数的对的条目中。例如,在伪代码中,
musum('octopus','swim')=M('octopus','swim')+M('octopus','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_和(单数,:)=M_和(单数,:)+M(复数,:)仅使用最后一个
复数
索引

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

尝试以下方法:

M_sum = (L + eye(size(L,1)))*M;
M_sum = triu(M_sum, 1);
M_sum = M_sum + M_sum.';
这是因为您已经有了矩阵
L
,所以可以使用矩阵乘法来选择
M
的行并求和


在此处使用accumarray有两个缺点:

  • 您需要应用
    find
    L
    转换为索引,作为
    accumarray
    的第一个输入。所以,还有一步
  • accumarray
    只能对数字求和,不能对行向量求和(其第二个输入只能是列向量,不能是矩阵)。因此,您需要为每列
    M
    调用一次
    accumarray

当然!矩阵乘法是对行求和。这对我来说很有用,但我该如何澄清我的问题,以便对未来的读者更有用呢?@Cecilia其实这个问题并不那么清楚;只是很长。一开始我并不是什么都懂,因为我有阅读问题太快的倾向。但这一切都在那里(我将编辑我的答案以删除该成分,因为它不再是真实的,并且可能会产生误导)。因此,我唯一的建议是,如果可以在不失去任何意义的情况下,稍微缩短问题的长度。顺便说一句,你关心未来的读者真是太好了。这里的一些提问者似乎忘记了这一点!:-)