Since blockproc https://www.mathworks.com/help/images/ref/blockproc.html(以及已弃用的blkproc
) 都是函数图像处理工具箱 https://www.mathworks.com/products/image.html,我想我应该添加一个不需要额外工具箱的基本 MATLAB 解决方案...
如果要将矩阵划分为子矩阵,一种方法是使用mat2cell https://www.mathworks.com/help/matlab/ref/mat2cell.html分解矩阵并将每个子矩阵存储在元胞数组的元胞中。对于您的情况,语法如下所示:
C = mat2cell(I, [128 128], [128 128]);
C
现在是一个 2×2 元胞数组,每个元胞存储一个 128×128 子矩阵I
。如果你想对每个单元格执行操作,你可以使用该函数cellfun https://www.mathworks.com/help/matlab/ref/cellfun.html。例如,如果您想取每个子矩阵中的值的平均值,您可以执行以下操作:
meanValues = cellfun(@(x) mean(x(:)), C);
第一个参数是函数句柄 https://www.mathworks.com/help/matlab/function-handles.html to an 匿名函数 https://www.mathworks.com/help/matlab/matlab_prog/anonymous-functions.html它首先将每个子矩阵重塑为列向量,然后取平均值。输出是每个子矩阵平均值的 2×2 矩阵。如果您传递给的函数cellfun
为每个单元创建不同大小或类型的输出,然后cellfun
将它们连接起来会出现问题并抛出错误:
??? Error using ==> cellfun
Non-scalar in Uniform output, at index 1, output 1.
Set 'UniformOutput' to false.
如果你添加..., 'UniformOutput', false);
到通话结束cellfun
,那么上述情况的输出将是 2×2单元阵列包含对每个子矩阵执行操作的结果。