【问题标题】:How do I append one matrix to another in Scala?如何在 Scala 中将一个矩阵附加到另一个矩阵?
【发布时间】:2011-08-10 10:16:09
【问题描述】:

如果我有以下代码:

var A = Array[Array[Double]]()    // where A becomes an MxP matrix
var B = Array[Array[Double]]()    // where B becomes an NxP matrix

如以下伪代码所示,有哪些有效的方法可以将一个矩阵附加到另一个矩阵,从而生成一个矩阵?

val C = A append B    // where C is a (M+N)xP matrix

显然,其中一个维度(在本例中为 P)保持不变。

编辑:到目前为止,所提供的两种解决方案都在第二维度增长。我正在尝试固定第二个维度。

【问题讨论】:

    标签: arrays scala append


    【解决方案1】:

    功能性强,但性能不如命令式替代方案:

    scala> val a = Array.tabulate(2, 3)((_, _) => (math.random * 100).toInt)
    a: Array[Array[Int]] = Array(Array(52, 61, 58), Array(35, 69, 39))
    
    scala> val b = Array.tabulate(2, 4)((_, _) => (math.random * 100).toInt)
    b: Array[Array[Int]] = Array(Array(51, 54, 87, 10), Array(52, 76, 18, 85))
    
    scala> (a, b).zipped.map(_ ++ _)
    res0: Array[Array[Int]] = Array(Array(52, 61, 58, 51, 54, 87, 10), Array(35, 69, 39, 52, 76, 18, 85))
    

    (回复评论...)

    保持第二个维度固定:

    scala> val x = Array.tabulate(3, 2)((_, _) => (math.random * 100).toInt)
    x: Array[Array[Int]] = Array(Array(13, 26), Array(96, 6), Array(68, 58))
    
    scala> val y = Array.tabulate(2, 2)((_, _) => (math.random * 100).toInt)
    y: Array[Array[Int]] = Array(Array(82, 5), Array(0, 76))
    
    scala> x ++ y
    res1: Array[Array[Int]] = Array(Array(13, 26), Array(96, 6), Array(68, 58), Array(82, 5), Array(0, 76))
    

    【讨论】:

    • 性能与这部分代码无关。是否有可能向另一个方向发展?也就是说,在我的帖子中,我让 P 保持不变(第二维)
    • 在另一个维度上增长最简单(虽然不一定是最快)的方法是首先transpose两个输入数组,然后在连接后转置输出。
    【解决方案2】:
    scala> val a = Array.fill(4,3) { 1. };
    a: Array[Array[Double]] = Array(Array(1.0, 1.0, 1.0), Array(1.0, 1.0, 1.0), Array(1.0, 1.0, 1.0), Array(1.0, 1.0, 1.0))
    
    scala> val b = Array.fill(4,6) { 2. };         
    b: Array[Array[Double]] = Array(Array(2.0, 2.0, 2.0, 2.0, 2.0, 2.0), Array(2.0, 2.0, 2.0, 2.0, 2.0, 2.0), Array(2.0, 2.0, 2.0, 2.0, 2.0, 2.0), Array(2.0, 2.0, 2.0, 2.0, 2.0, 2.0))
    
    scala> for((aa,bb) <- a zip b) yield (aa ++ bb)
    res0: Array[Array[Double]] = Array(Array(1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0), Array(1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0), Array(1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0), Array(1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0))
    

    【讨论】:

    • 是否有可能向另一个方向发展?也就是说,在我的帖子中,我让 P 保持不变(第二维)
    猜你喜欢
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    相关资源
    最近更新 更多