道歉,如果这是一个相对基本的问题 - 我对编程仍然有点新,特别是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。
感谢任何帮助!
答案 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的第一条评论。关于速度,请参阅下面的其他评论。