如何收集 n 个 2D 数组/列表(矩阵)的 m 个大小的 2D 数组/列表(子矩阵),其中 m < n in Kotlin functionally?

问题描述 投票:0回答:1

我想找到 2D 列表/数组(矩阵)的重叠 2D 列表/数组(子矩阵),如下所示:

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

在简单的情况下,我需要获取所有大小为 m 的重叠正方形,即

m x m
大小重叠的 2D 列表/数组。 例如,在上面的情况下,令 m 为 3。

我以命令的方式执行以下操作:

for (i in 0 until matrix.size - m) {
  for (j in 0 until matrix.size - m) {
    var q = mutableListOf<Int>()       // can be a real 2D list, here a plain list to simplify
    for (k in i..i + m) {
      for (l in j..j + m) {
        q.add(matrix[m][n])
      }
    }
    // add an m size matrix to result here
  }
}

我尝试了一些带有窗口(m)和使用 m 作为内部上限的映射范围的东西,但无法想出一个可行的解决方案。

如果您知道如何在 Kotlin 中以函数式方式制作它,请分享。 一句不是必须的,但会很棒。

kotlin matrix multidimensional-array windowed
1个回答
0
投票

如果我理解,在示例中你的输出应该是

    [[1, 2, 3], 
     [5, 6, 7], 
     [9, 1, 2]]

    [[2, 3, 4], 
     [6, 7, 8], 
     [1, 2, 3]]

所以

matrix_with = matrix.get(0).size
matrix_height = matrix.size
new_matrix = mutableListOf<MutableList<Int>>()
shift_with = matrix_with - m
shift_height = matrix_height - m
for(with in 0..shift_with){
    for(height in 0..shift_height){
        for(with in 0..m){
            for(height in 0..m){
                new_matrix[i][j] = matrix[i][j]
            }
        }
    }
}

没有尝试是否有效,但我认为这就是逻辑

© www.soinside.com 2019 - 2024. All rights reserved.