Javascript:将2D数组拆分为方形区域,并求每个区域的最大值之和

Javascript:将2D数组拆分为方形区域,并求每个区域的最大值之和,javascript,arrays,Javascript,Arrays,我想从左上角开始,将一个矩阵分割成具有给定尺寸(k)的正方形区域,然后求每个区域的最大值之和。 这就是我到目前为止所做的 arr=[ [ 0, 8, 1, 1, 10, 6 ], [ 6, 8, 7, 0, 3, 9], [ 0, 7, 6, 8, 6, 5], [ 4, 0, 2, 7, 2, 0], [ 4, 4, 5, 7, 5, 1] ],l=console.log,j=JSON.stringify result=[0,3].map(i=>arr.map(a=>a.slice(i,i+

我想从左上角开始,将一个矩阵分割成具有给定尺寸(k)的正方形区域,然后求每个区域的最大值之和。 这就是我到目前为止所做的

arr=[
[ 0, 8, 1, 1, 10, 6 ],
[ 6, 8, 7, 0, 3, 9],
[ 0, 7, 6, 8, 6, 5],
[ 4, 0, 2, 7, 2, 0],
[ 4, 4, 5, 7, 5, 1]
],l=console.log,j=JSON.stringify
result=[0,3].map(i=>arr.map(a=>a.slice(i,i+3))//映射要拆分的索引以获得部分
l(j(结果))

常数arr=[
[ 0, 8, 1, 1, 10, 6 ],
[ 6, 8, 7, 0, 3, 9],
[ 0, 7, 6, 8, 6, 5],
[ 4, 0, 2, 7, 2, 0],
[ 4, 4, 5, 7, 5, 1]
];
常数sizeX=3,sizeY=3;
//浏览不同的方块
for(设minX=0;minX}
您可以使用
reduce()
forEach()
方法在区域中拆分矩阵

const arr=[
[0, 8, 1, 1, 10, 6],
[6, 8, 7, 0, 3, 9],
[0, 7, 6, 8, 6, 5],
[4, 0, 2, 7, 2, 0],
[4, 4, 5, 7, 5, 1]
],l=console.log,j=JSON.stringify
函数拆分矩阵(数据,n){
设row=0;
返回数据.reduce(函数(r,a,i){
如果(i&&i%n==0)行++;
设col=0;
a、 forEach(函数(e,j){
如果(j&&j%n==0)列++;
如果(!r[row])r[row]=[];
如果(!r[row][col])r[row][col]=[];
r[行][列].推送(e)
})
返回r;
}, [])
}
常数s=分裂矩阵(arr,3);

log(j(s))
在您的示例中,阵列是6x5,因此无法将其均匀地分割为方形区域。不过这有点离题了。如果你想了解整个过程,第一步是要有一个函数,它可以获取矩阵的某个部分,并将其求和

假设我们有一个矩阵,我们想要做一个函数,它取x,y,宽度和高度作为我们想要求和的值

const m=[
[1,2,3,4,5],
[2,3,4,5,6],
[3,4,5,6,7],
[8,9,10,11,12]
];
常数面积=(m,x,y,w,h)=>{
设和=0;
如果(y+h>m.长度){
抛出新错误('矩阵对于请求的区域不够高');
}
如果(x+w>m[0]。长度){
抛出新错误('矩阵对于请求区域不够宽');
}
对于(设j=y;j日志(sumrea(m,0,0,3,3))使用相同长度和高度的数组,可以迭代数组并获取组的索引进行计数

var数组=[[0,8,1,1,10,6],[6,8,7,0,3,9],[0,7,6,8,6,5],[4,0,2,7,2,0],[4,4,5,7,5,1],[0,1,0,1,0,1],
结果=数组.reduce((r,a,i)=>{
a、 forEach((b,j)=>{
r[Math.floor(i/3)]=r[Math.floor(i/3)]| |[];
r[Math.floor(i/3)][Math.floor(j/3)]=(r[Math.floor(i/3)][Math.floor(j/3)]| | 0)+b;
});
返回r;
}, []);
控制台日志(结果)

。作为控制台包装{max height:100%!important;top:0;}
我知道它有点复杂,但它正在工作。它将尝试获取您想要的区域,但如果无法获得特定大小的区域,它将使用剩余的任何值。(在我们的示例中,它将数组分成2个3*3的区域,另2个2*3的区域)(警告:-如果区域中的所有元素都小于-100,则它将不起作用,如果您希望它起作用,请相应地更改“runningMax”的值)

功能最大值(arr){
var runningMax=-100;
对于(i=0,i2=arr.length;i arr.map(a=>a.slice(i,i+3));
y=[0,3].map(i=>result.map(a=>a.slice(i,i+3));
var v=0;
y、 forEach(函数(e){
e、 forEach(函数(q){
//console.log(最大值(q)+“”+q);
v+=最大值(q);
})
});

console.log(v);
据我所知,您希望查看给定矩阵的所有可能的3x3子矩阵。因此,我假设在您的示例矩阵中,您希望查看:

[ 0, 8, 1 ]    [ 8, 1, 1 ]    [ 1, 1, 10]    [ 1, 10, 6 ]
[ 6, 8, 7 ]    [ 8, 7, 0 ]    [ 7, 0, 3 ]    [ 0, 3,  9 ]
[ 0, 7, 6 ]    [ 7, 6, 8 ]    [ 6, 8, 6 ]    [ 8, 6,  5 ]

[ 6, 8, 7 ]    [ 8, 7, 0 ]    [ 7, 0, 3 ]    [ 0, 3, 9 ]
[ 0, 7, 6 ]    [ 7, 6, 8 ]    [ 6, 8, 6 ]    [ 8, 6, 5 ]
[ 4, 0, 2 ]    [ 0, 2, 7 ]    [ 2, 7, 2 ]    [ 7, 2, 0 ]

[ 0, 7, 6 ]    [ 7, 6, 8 ]    [ 6, 8, 6 ]    [ 8, 6, 5]
[ 4, 0, 2 ]    [ 0, 2, 7 ]    [ 2, 7, 2 ]    [ 7, 2, 0]
[ 4, 4, 5 ]    [ 4, 5, 7 ]    [ 5, 7, 5 ]    [ 7, 5, 1]
那么我知道你想要找到最大值(12个矩阵的12个最大值):

这些的总和是100。因此,如果这确实是你想要的结果,那么这里有一个函数方法来获得它:

const arr=[
[ 0, 8, 1, 1, 10, 6 ],
[ 6, 8, 7, 0, 3, 9],
[ 0, 7, 6, 8, 6, 5],
[ 4, 0, 2, 7, 2, 0],
[ 4, 4, 5, 7, 5, 1]
];
const sum=arr.slice(2)。减少(
(和,行,i)=>行。切片(2)。减少(
(sum,a,j)=>sum+Math.max(…arr[i]。切片(j,j+3),
…arr[i+1]。切片(j,j+3),
…行切片(j,j+3)),
总和
), 0
)

console.log(sum);
正方形区域是3*3?是@ninascholz给定数组只有5行。它应该是3*3矩阵,而不是OP所说的0-3矩阵,因此6*5的3*3子矩阵的计数应该是4*3=12。
8    8   10   10

8    8    8    9

7    8    8    8