在不使用 for 循环的情况下对矩阵的子矩阵求和

summing of submatrices of a matrix without using for loops

我有一个代码,可以将 256 x 256 矩阵的 8 x 8 子单元相加,得到一个更小的 32 x 32 矩阵。我使用 for 循环,这会使过程变慢。这可以在不使用循环的情况下完成吗?我需要在优化工具 CVX 中使用这个求和代码,它不能很好地与内置的 MATLAB 函数配合使用。因此,它必须是没有内置函数的代码(尽管允许求和和均值)。

img=rand(256);
m=1;
n=1;
for i=1:8:256
    for j=1:8:256
        temp=img(i:i+7,j:j+7);
        D(m,n)=sum(temp(:));
    n=n+1;
    end
    m=m+1;
    n=1;
end

There is already a solution,但我们必须对其进行适配以与CVX兼容。

squeeze(sum(sum(reshape(X,k,n/k,k,n/k),1),3))

I need to use this summing code in an optimization tool, CVX, which doesn't go well with in-built MATLAB functions.

幸好只有部分内置功能不能用,不然就很辛苦了。引自 the reference guide:

A number of Matlab’s basic linear and bilinear functions either work automatically with cvx expressions or have been extended to do so, including: conj, conv, cumsum, diag, dot, find, fliplr, flipud, flipdim, horzcat, hankel, ipermute, kron, mean, permute, repmat, reshape, rot90, sparse, sum, trace, tril, triu, toeplitz, vertcat.

允许重塑,这意味着必须更换挤压。这里挤压用于将 [1, n/k, 1, n/k] 矩阵重塑为 [n/k n/k] 矩阵。可以使用 reshape 替换它:

n=6
k=2
X=magic(n)
reshape(sum(sum(reshape(X,k,n/k,k,n/k),1),3),n/k,n/k)