2017-02-15 4 views
2

J'ai le code suivant dans Matlab qui copie sur une sous-sélection d'une matrice sur l'autre à savoir qu'il copie une tranche des lignes entre i et j par exemple.Migration de Matlab vers Saddle: Comment faire muter une sélection matricielle?

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

Je voudrais faire la même chose en utilisant Scala Saddle donc j'essayé:

// 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 

Est-il possible de le faire en utilisant plutôt que sous-sélections vectoriales itérer les matrices en utilisant des indices?

Répondre

1

OK J'ai trouvé un moyen pour mon cas particulier mais je pense qu'il ne devrait pas y avoir de problème pour le généraliser. Tout d'abord, Saddle's Mat instances sont immuables, par conséquent, il a besoin d'une approche complètement différente. Deuxièmement, rowSlice bien qu'il compile pour Mat, émet toujours une exception s'attendant à avoir des index valides, c'est-à-dire qu'il s'applique uniquement à Frame et non Mat, potentiellement un bogue de la bibliothèque Saddle.

Ma nouvelle approche consistait à collecter toutes les lignes découpées de matrix2 en séquences de lignes, puis à construire matrix1 en tant que nouvelle matrice à la fois à partir de la séquence de lignes résultante. Enfin, étant donné que le constructeur Mat attend une séquence de la colonne Vect, il doit également être transposé:

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