JavaScript如何分割矩阵并计算子矩阵的最小值与最大值
JavaScript实现2×2滑动子矩阵提取与最值计算
实现思路
这个需求的核心是步长为1的2×2滑动窗口逻辑,不需要提前把所有子矩阵拆出来单独存储,直接在遍历窗口的时候计算最值即可,步骤如下:
- 先确定结果矩阵的尺寸:假设原始矩阵有
M行N列,因为2×2窗口每次移动1格,不会超出原始矩阵边界,所以最终输出的最大值、最小值矩阵尺寸固定为(M-1)行(N-1)列,和3×3原始矩阵输出2×2结果的规律完全匹配。 - 遍历所有窗口的左上角坐标:行索引
i的遍历范围是0到M-2,列索引j的遍历范围是0到N-2,每个(i,j)坐标正好对应结果矩阵里一个值的位置。 - 对每个窗口,提取覆盖到的4个元素:分别是当前位置右、下、右下三个相邻位置的元素,加上当前位置本身,正好组成2×2的子矩阵元素集合。
- 对每个窗口的元素集合分别求最大值、最小值,填入结果矩阵对应的
(i,j)位置即可,不需要额外存储拆分后的所有子矩阵,减少内存占用。
完整实现代码
const matrix = [ [1,5,7], [7,3,5], [2,6,9] ]; function calcSubMatrixMaxMin(originMatrix) { const rowCount = originMatrix.length; const colCount = originMatrix[0].length; // 初始化两个结果矩阵 const maxRes = Array.from({ length: rowCount - 1 }, () => []); const minRes = Array.from({ length: rowCount - 1 }, () => []); for (let i = 0; i < rowCount - 1; i++) { for (let j = 0; j < colCount - 1; j++) { // 取当前2*2窗口的四个元素 const curWindowVals = [ originMatrix[i][j], originMatrix[i][j + 1], originMatrix[i + 1][j], originMatrix[i + 1][j + 1] ]; maxRes[i][j] = Math.max(...curWindowVals); minRes[i][j] = Math.min(...curWindowVals); } } return { maxMatrix: maxRes, minMatrix: minRes }; } // 调用测试 const { maxMatrix, minMatrix } = calcSubMatrixMaxMin(matrix); console.log(maxMatrix); // 输出 [[7,7],[7,9]],和预期一致 console.log(minMatrix); // 输出 [[1,3],[2,3]],和预期一致
扩展说明
如果后续需要调整子矩阵的大小、滑动步长,只需要修改遍历边界、窗口元素的提取逻辑即可,核心滑动遍历的思路不需要改动。
内容的提问来源于stack exchange,提问作者Collins
相关产品推荐
相关产品推荐

