【问题标题】:summing of submatrices of a matrix without using for loops在不使用 for 循环的情况下对矩阵的子矩阵求和
【发布时间】:2020-05-12 05:27:53
【问题描述】:

我有一个代码,它对 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

【问题讨论】:

  • 你有图片处理工具箱吗?
  • 同样的问题,只是询问平均值:stackoverflow.com/q/22362988/2732801
  • @Daniel Dupe,不是吗?
  • 需要编写不使用任何内置函数的代码。我需要将此函数提供给优化包(即 CVX),当它看到破坏问题凸性的内置函数时,它开始吓坏了
  • @AKhan:请更新您的问题以反映您的限制。如果我没记错 CVX,一些功能(包括重塑)是允许的,但我想当你尝试使用这个时,挤压是问题所在? stackoverflow.com/a/22363530/2732801

标签: matlab loops for-loop matrix downsampling


【解决方案1】:

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

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

我需要在优化工具 CVX 中使用这个求和代码,它不能很好地与内置的 MATLAB 函数配合使用。

幸好只有部分内置函数无法使用,否则会非常困难。来自the reference guide的引用:

Matlab 的许多基本线性和双线性函数要么自动与 cvx 表达式一起工作,要么已扩展为这样做,包括: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。

reshape 是允许的,这意味着必须更换挤压。这里使用挤压将 [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)

【讨论】:

  • 非常感谢。事实证明,squeeze 适用于 CVX。但不知何故,它没有在列表中提及
猜你喜欢
  • 2014-05-01
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-06
相关资源
最近更新 更多