【问题标题】:scala-breeze/spark replace a row of a densematrix with another densevectorscala-breeze/spark 用另一个densevector替换一行densematrix
【发布时间】:2018-06-20 18:14:46
【问题描述】:

我有一个微风.linalg.DenseMatrix:

breeze.linalg.DenseMatrix[Int] =  
1  5  9  
2  6  10  
3  7  11  
4  8  12  

还有一个微风.linalg.DenseVector:

breeze.linalg.DenseVector[Int] = DenseVector(13, 14, 15)  

切片允许我获取 DenseMatrix 的特定行,但不能替换/重新分配它。如何用向量替换矩阵的其中一行(例如第二行)以获得如下所示的内容?

1  5  9  
13 14 15  
3  7  11  
3  8  12  

另外,有没有办法使用 Spark 的任何矩阵类型来实现这种矩阵操作?如果是,那就更可取了。

【问题讨论】:

    标签: scala apache-spark breeze apache-spark-ml scala-breeze


    【解决方案1】:

    切片允许我获取 DenseMatrix 的特定行,但不能替换/重新分配

    确实如此,您只需要正确的形状 - 行切片已转置

    val m = DenseMatrix((1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12))
    
    // breeze.linalg.Transpose[breeze.linalg.DenseVector[Int]] = Transpose(DenseVector(10, 11, 12))
    

    所以你需要匹配转置向量

    val v = DenseVector(10, 11, 12)
    m(1, ::) := v.t
    m
    
    // breeze.linalg.DenseMatrix[Int] =
    // 1   5   9
    // 10  11  12
    // 3   7   11
    // 4   8   12
    

    另外,有没有办法使用 Spark 的任何矩阵类型来实现这种矩阵操作?如果是,那就更可取了。

    Spark ml.linalgmllib.linalg 不是功能齐全的线性代数工具,主要用于支持其他 ml / mllib 函数,因此不支持切片和修改。您必须访问底层 RDD 并使用连接手动转换数据。

    【讨论】:

    • 为我工作!像我这样的菜鸟的重要收获:1. 使用元素赋值运算符而不是赋值(:= 而不是 =)2. 行切片默认是转置向量!
    • 您能否突出强调需要使用元素赋值运算符这一事实?这是一件人们可以错过的大事。
    猜你喜欢
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    相关资源
    最近更新 更多