
kotlin 和 java 标准库均未提供内置的二维数组“union”(逐元素合并)方法;需自行实现通用矩阵运算扩展函数,支持自定义合并逻辑(如加法、乘法等),并确保维度一致与类型安全。
kotlin 和 java 标准库均未提供内置的二维数组“union”(逐元素合并)方法;需自行实现通用矩阵运算扩展函数,支持自定义合并逻辑(如加法、乘法等),并确保维度一致与类型安全。
在 Kotlin 中,所谓“union”二维数组——实为逐元素二元运算(element-wise binary operation),例如将两个同形二维整数数组按位置相加、取最大值或执行自定义逻辑。标准库中 Array
因此,推荐通过扩展函数封装安全、可复用的矩阵操作。以下是一个健壮的通用实现:
/**
* 对两个同维度二维数组执行逐元素二元操作
* @receiver 被操作的二维数组(左操作数)
* @param b 右操作数二维数组
* @param op 作用于对应位置元素的二元函数:(left, right) -> result
* @throws IllegalArgumentException 当行列尺寸不匹配时抛出
*/
fun Array<array>>.matrixOp(
b: Array<array>>,
op: (Int, Int) -> Int
): Array<array>> {
require(this.size == b.size) { "行数不匹配:${this.size} ≠ ${b.size}" }
return mapIndexed { i, row ->
require(row.size == b[i].size) { "第 $i 行列数不匹配:${row.size} ≠ ${b[i].size}" }
row.mapIndexed { j, value -> op(value, b[i][j]) }.toTypedArray()
}.toTypedArray()
}</array></array></array>
使用示例如下:
val a = arrayOf(
arrayOf(1, 0),
arrayOf(0, 0)
)
val b = arrayOf(
arrayOf(1, 0),
arrayOf(0, 1)
)
// 逐元素相加 → union 的典型语义
val sum = a.matrixOp(b) { a, b -> a + b }
// 结果:[[2, 0], [0, 1]]
// 逐元素相乘
val product = a.matrixOp(b) { a, b -> a * b }
// 结果:[[1, 0], [0, 0]]
// 逐元素取较大值
val max = a.matrixOp(b) { a, b -> maxOf(a, b) }
// 结果:[[1, 0], [0, 1]]
⚠️ 注意事项:
- 该实现严格校验维度一致性(行数与每行列数),避免运行时 IndexOutOfBoundsException;
- 仅支持 Array
>,如需泛型支持(如 Double、Float 或自定义类型),可改用 inline 泛型函数配合 reified 类型参数,但需注意装箱开销; - 若涉及大规模数值计算,建议迁移到专业数学库(如 viktor 或 ND4J),以获得底层优化与广播机制;
- 不要直接修改原数组——本实现始终返回新数组,符合 Kotlin 不可变性设计哲学。
总结:虽无开箱即用的 union 方法,但借助 Kotlin 的扩展函数与高阶函数特性,可简洁、安全、类型明确地实现任意二维数组逐元素合并逻辑,兼顾可读性与工程实用性。











