通过添加每n

时间:2015-06-10 16:36:30

标签: matlab

不知道如何解释,所以这里举个例子:

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的乘数。

3 个答案:

答案 0 :(得分:4)

方法1:

使用mat2cellcellfun

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:

使用permutereshape

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)

以下是两种替代方法:

方法#1 - 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

方法#2 - accumarraykron

我们可以使用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