从Matlab迁移到Saddle:如何改变矩阵选择?

时间:2017-02-15 12:09:29

标签: matlab scala saddle

我在Matlab中有以下代码,它将一个矩阵的子选择复制到另一个矩阵上,即它复制ij之间的行切片,例如。

 % matrices
 matrix1(i:j,:) = matrix2(i:j,:)

我想使用Scala Saddle做同样的事情,所以我尝试了:

 // matrices
 val matrix1 = Mat[Double](M, N)
 val matrix2 = Mat[Double](M, N)
 // ...
 // but none of these work
 matrix2.rowSlice(i, j) = matrix2.rowSlice(i, j)
 matrix2.rowSlice(i, j).toMat.toVec = matrix2.rowSlice(i, j).toMat.toVec

有没有办法使用矢量子选择而不是使用索引迭代矩阵?

1 个答案:

答案 0 :(得分:1)

好的,我为我的特定用例找到了一种方法,但我认为概括它应该没问题。首先,Saddle's Mat个实例是不可变的,因此它需要完全不同的方法。其次,rowSlice虽然它为Mat编译,但总是会抛出一个期望拥有有效索引的异常,即它只适用于Frame而不是Mat,可能是一个马鞍的错误图书馆。

我的新方法是将matrix2中的所有切片行收集到行序列中,然后从生成的行序列中立即将matrix1构建为新矩阵。最后,由于Mat构造函数需要列Vect的序列,因此它也必须进行转置:

var RowSeq: Seq[Vec[Double]] = Seq()
RowSeq ++= matrix2.row((i1 to j1).toArray).rows()
RowSeq ++= matrix2.row((i2 to j2).toArray).rows()
RowSeq ++= matrix2.row((i3 to j3).toArray).rows()
val matrix1 = Mat(RowSeq.toArray).T