Swift - 如何减少矩阵

标签 swift matrix reduce

我有一个3维数组(array[x][y][z]x y z可以灵活)

var array = [ [[1,1,1],[0,0,0],[1,1,1]],
              [[1,0,1],[1,0,1],[1,0,1]],
              [[1,1,1],[0,0,0],[1,1,1]]
            ]

如何将 3D 简化为 2D:array[z][y]

[3,1,3],[2,0,2],[3,1,3]

我阅读了说明here但不知道如何申请到我的。

更新: 这是逻辑 enter image description here

enter image description here

最佳答案

让我们首先形成一个实用函数作为矩阵式数组的扩展(“cw”表示按列):

extension Array where Element == [[Int]] {
    func cwsum(_ ix1:Int, _ ix2:Int) -> Int {
        return reduce(0) {$0 + $1[ix1][ix2]}
    }
}

那么如果数组是:

let array = [[[1,1,1],[0,0,0],[1,1,1]],
             [[1,0,1],[1,0,1],[1,0,1]],
             [[1,1,1],[0,0,0],[1,1,1]]]

...那么答案是:

[[array.cwsum(0,0), array.cwsum(1,0), array.cwsum(2,0)],
 [array.cwsum(0,1), array.cwsum(1,1), array.cwsum(2,1)],
 [array.cwsum(0,2), array.cwsum(1,2), array.cwsum(2,2)]] 
// [[3, 1, 3], [2, 0, 2], [3, 1, 3]]

但是等等——我想我在这里看到了一种模式!我们可以重写它,而无需对索引进行硬编码,如下所示:

var result = [[Int]]()
for j in 0..<3 {
    var r1 = [Int]()
    for i in 0..<3 {
        r1.append(array.cwsum(i,j))
    }
    result.append(r1)
} // result is now [[3, 1, 3], [2, 0, 2], [3, 1, 3]]

好的,但是我们可以在哪里循环和 append ,我们可以map相反,从而变成i进入 map 变量:

var result = [[Int]]()
for j in 0..<3 {
    result.append((0..<3).map{i in array.cwsum(i,j)})
}

但是我们可以对 j 执行此操作也是如此——因此它变成了一行:

result = (0..<3).map{j in (0..<3).map{i in array.cwsum(i,j)}}

关于Swift - 如何减少矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43810327/

相关文章:

c - 在 C 中获取二维数组的输入

c - 在 for 循环中使用数组和函数

Java 8 将列表减少为链表

android - SurfaceTexture.getTransformMatrix 的返回值是什么意思,谁能解释一下?

Javascript:使用 || 减少函数

hadoop - hadoop mapreduce程序中的错误

ios - 将 cocoapods 用于 facebookSDK 时找不到“FBSDKAppEvents.h”文件

objective-c - 禁止转换 NSString

ios - Swift 4 - 通过 UIActivityViewController 共享位置

iOS 应用程序在启动时崩溃