Kotlin:对矩阵中各行元素求和的优雅方法?

Kotlin: Elegant way to sum elements across the rows in matrix?

给定一个 ArrayList (rows) of ArrayList(连续的元素),除了写一个“for”循环之外,是否有更好的方法来获得像 (row[0][0] + row[1][0] + .... row[n][0]) 这样的总和列表?

val matrix = arrayListOf(
        arrayListOf(1, 2, 3),
        arrayListOf(4, 5, 6),
        arrayListOf(7, 8, 9)
)
val allSum = matrix.sumBy { it.sumBy { it } } // 45
val firstColumnSum = matrix.sumBy { it[0] } // 12

您可以使用 sum and sumBy 来实现。

以下是 3 种方法:(1) 计算总矩阵和,(2) 计算给定行的和,以及 (3) 计算给定列的和:

val arr = arrayListOf(
        arrayListOf(1, 2, 3),
        arrayListOf(4, 5, 6),
        arrayListOf(7, 8, 9)
)

fun matrixSum() = arr.sumBy { it.sum() }
fun rowSum(row: Int) = arr[row].sum()
fun colSum(col: Int) = arr.sumBy {row -> row[col] }
// shorter alternative: fun colSum(col: Int) = arr.sumBy { it[col] }

根据您的问题,您想致电colSum(0)。这将提取 row[0](每行的索引值 0)并对这些值求和。

编辑:

关于你评论区的问题,有两种方法:(1)计算所有行的总和,返回一个列表;和 (2) 计算所有列总和,以列表形式返回。

fun rowSums() = arr.map { it.sum() }
fun colSums() = arr[0].indices.map { col -> colSum(col) }
// shorter alternative:
// fun colSums() = arr[0].indices.map(::colSum)
// another version that does not call colSum:
// fun colSums() = arr[0].indices.map { col -> arr.sumBy { row -> row[col] } }

解释 colSums(假定所有行的列数相同):首先,您获取第一行 (arr[0]),然后获取其 indices (i.e., its column numbers 0, 1, ..., up to nCols), and then you map这些指数各自的 colSum() 结果。这可能不是最高效的方式,但它非常可读。