我在Matlab中有以下代码,它将一个矩阵的子选择复制到另一个矩阵上,即它复制i
和j
之间的行切片,例如。
% 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
有没有办法使用矢量子选择而不是使用索引迭代矩阵?
答案 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