不知道如何解释,所以这里举个例子:
A=[1 0 0 1 4 4 4 4
0 0 0 0 2 3 2 2
0 0 0 0 0 0 0 1
2 3 4 5 2 3 4 1 ]
结果:
b=[ 1 1 13 12
5 9 5 6];
通过在原始内部添加N尺寸子矩阵来计算每个元素,在本例中为N=2
。
所以b(1,1)
为A(1,1)+A(1,2)+A(2,1)+A(2,2)
,b(1,4)
为A(1,7)+A(2,7)+A(1,8)+A(2,8)
。
视觉上更清楚:
A=[|1 0| 0 1| 4 4| 4 4|
|0 0| 0 0| 2 3| 2 2|
____________________
|0 0| 0 0| 0 0| 0 1|
|2 3| 4 5| 2 3| 4 1| ]
b
是这些方块上元素的总和,在这个大小为2的示例中。
我可以想象如何用循环制作它,但它只是感觉可矢量化。关于如何做到的任何想法?
假设矩阵A的大小是N的乘数。
答案 0 :(得分:4)
方法1:
n = 2;
AC = mat2cell(A,repmat(n,size(A,1)/n,1),repmat(n,size(A,2)/n,1));
out = cellfun(@(x) sum(x(:)), AC)
方法2:
n = 2;
[rows,cols] = size(A);
out = reshape(sum(sum(permute(reshape(A,n,rows/n,n,[]),[1 3 2 4]))),rows/n,[]);
PS:这是与此相关的关闭question,您可能会发现它很有用。这个问题是找到意思,而这个是找到总和。
答案 1 :(得分:4)
如果你有图像处理工具箱 blockproc
也可以选择:
B = blockproc(A,[2 2],@(x) sum(x.data(:)))
答案 2 :(得分:4)
以下是两种替代方法:
im2col
使用图像处理工具箱的另一种方法是使用带有im2col
标记的distinct
并对所有结果列求和。然后,您需要将矩阵重新整形为正确的大小:
n = 2;
B = im2col(A, [n n], 'distinct');
C = reshape(sum(B, 1), size(A,1)/n, size(A,2)/n);
我们选择C
:
>> C
C =
1 1 13 12
5 9 5 6
accumarray
和kron
我们可以使用kron
生成一个索引矩阵,我们可以将其用作accumarray
的二进制数,并调用sum
作为自定义函数。我们将再次将矩阵重塑为正确的大小:
n = 2;
M = reshape(1:prod([size(A,1)/n, size(A,2)/n]), size(A,1)/n, size(A,2)/n);
ind = kron(M, ones(n));
C = reshape(accumarray(ind(:), A(:), [], @sum), size(A,1)/n, size(A,2)/n);
我们再次获得C
:
C =
1 1 13 12
5 9 5 6