2017-02-15 21 views
2

我在Matlab中有下面的代碼,複製從一個矩陣到另一個矩陣的子選擇,也就是複製ij之間的行的切片,例如,從Matlab遷移到鞍座:如何變更矩陣選擇?

% 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 

有沒有辦法做到這一點使用矢量subselections而不是使用迭代指數矩陣?

回答

1

好的我找到了一種適合我的特殊用例的方法,但我認爲推廣它應該不成問題。首先,Saddle's Mat實例是不可變的,因此它需要完全不同的方法。其次,rowSlice雖然編譯爲Mat,但總是拋出期望擁有有效索引的異常,即它只適用於Frame而不是Mat,這可能是Saddle庫的一個錯誤。

我的新方法是將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