Czy istnieje ogólny sposób korzystania z Breeze, aby osiągnąć to, co możesz zrobić za pomocą transmisji w NumPy?
W szczególności, jeśli mam operatora, który chciałbymstosuje się do dwóch macierzy 3x4, mogę zastosować tę operację w sposób elementarny. Mam jednak matrycę 3x4 i 3-elementowy wektor kolumnowy. Chciałbym funkcji, która wytwarza matrycę 3x4 utworzoną z zastosowania operatora do każdego elementu macierzy z elementem z wektora dla odpowiedniego wiersza.
Więc dla podziału:
2 4 6 / 2 3 = 1 2 3
3 6 9 1 2 3
Jeśli to nie jest możliwe, chętnie przyjrzę się jego wdrożeniu.
Odpowiedzi:
3 dla odpowiedzi № 1Możesz użyć mapPairs, aby osiągnąć to, o czym "myślę", czego szukasz:
val adder = DenseVector(1, 2, 3, 4)
val result = DenseMatrix.zeros[Int](3, 4).mapPairs({
case ((row, col), value) => {
value + adder(col)
}
})
println(result)
1 2 3 4
1 2 3 4
1 2 3 4
Jestem pewien, że możesz dostosować to, co chcesz, z prostego "addera" powyżej.
1 dla odpowiedzi nr 2
Breeze obsługuje teraz nadawanie tego rodzaju:
scala> val dm = DenseMatrix( (2, 4, 6), (3, 6, 9) )
dm: breeze.linalg.DenseMatrix[Int] =
2 4 6
3 6 9
scala> val dv = DenseVector(2,3)
dv: breeze.linalg.DenseVector[Int] = DenseVector(2, 3)
scala> dm(::, *) :/ dv
res4: breeze.linalg.DenseMatrix[Int] =
1 2 3
1 2 3
The *
operator mówi, którą oś ma nadawać. Breeze nie zezwala na dorozumiane nadawanie, z wyjątkiem typów skalarnych.