求和行,但每行删除不同的术语

时间:2014-10-10 16:44:58

标签: matlab matrix sum

道歉,如果这是一个相对基本的问题 - 我对编程仍然有点新,特别是Matlab。基本上我想创建4940x1列向量,其中每个项等于4940x4940方阵的相应行的总和。到目前为止,很容易。

但是,我希望每行从总和中删除一系列术语,特别是前26行的前26个术语,第2行的第26个术语(即术语27-52)等等,直到你获得最后26行的第190集26个术语(即4940,4915:4940)。我不确定我是否能很好地解释这一点,所以最好用魔法4矩阵进行说明:

A =

    16     3     2    13;

     5    10    11     8;

     9     6     7    12;

     4    15    14     1

除了计算每一行的总和之外,我想从第1行减去1,1:2(即34-16-3),从第2行减去2,1:2(即34-5-10) ),第3行(即34-7-12)的3,3:4和第4行(34-14-1)的4,3:4。

感谢任何帮助!

3 个答案:

答案 0 :(得分:1)

bsxfun基于求和和重塑的方法 -

sublen = 26; %// subset length
nrows = size(A,1); %// number of rows in input matrix
nsubs = nrows/sublen; %// number of subsets

idx1 = bsxfun(@plus,[1:sublen]',[0:sublen-1]*nrows);%//'# starting block indices
idx2 = bsxfun(@plus,idx1(:),[0:nsubs-1]*(nrows*sublen+sublen));%// all block indices
exclude_sum = sum(A(reshape(idx2,sublen,sublen,[])),2); %// block elements summed 
                            %// (these would be subtracted from the wholesome sum)
out = sum(A,2) - exclude_sum(:); %// desired output

此方法似乎比基于6-7x的其他基于kron的方法的改进版本快{{1}}。

以下是运行时 - https://ideone.com/vZRRfe

答案 1 :(得分:1)

对于删除某些元素的总和,您可以轻松创建一个掩码(使用blkdiag)来指示哪些元素归零:

%// Total sum:
s1 = sum(A, 2);

%// Sum removing elements:
m = size(A, 1);
n = 26;
c = repmat({true(26)}, m/n, 1);
s2 = sum(A.* ~blkdiag(c{:}), 2)

答案 2 :(得分:0)

将矩阵元素与以下矩阵相乘:

M = 1-kron(eye(4940/26),ones(26));

通过这种方式,您可以将不想要的元素乘以0,将其他元素乘以1。

您现在可以像以前一样对结果进行求和:sum(.,2)

对于神奇的例子,你得到M =

 0     0     1     1
 0     0     1     1
 1     1     0     0
 1     1     0     0

A .* M =

 0     0     2    13
 0     0    11     8
 9     6     0     0
 4    15     0     0

sum(A.*M, 2) =

15
19
15
19

我更新了答案,并考虑了Divakar的第一条评论。关于速度,请参阅下面的其他评论。