Матричное векторное умножение в Scala - PullRequest
0 голосов
/ 08 марта 2020

У меня есть Матрица размера D от D (реализована как List [List [Int]]) и Вектор размера D (реализована как List [Int]) , Предполагая значение D = 3 , я могу создать матрицу и вектор следующим образом.

val Vector = List(1,2,3)
val Matrix = List(List(4,5,6) , List(7,8,9) , List(10,11,12))

Я могу умножить их на

(Matrix,Vector).zipped.map((x,y) => (x,Vector).zipped.map(_*_).sum )

Этот код умножается матрица с вектором и возвращает мне вектор по мере необходимости. Я хочу спросить, есть ли более быстрый или оптимальный способ получить тот же результат, используя Scala функциональный стиль? Как и в моем сценарии, у меня гораздо большее значение D .

1 Ответ

2 голосов
/ 08 марта 2020

Как насчет этого?

def vectorDotProduct[N : Numeric](v1: List[N], v2: List[N]): N = {
  import Numeric.Implicits._

  // You may replace this with a while loop over two iterators if you require even more speed.
  @annotation.tailrec
  def loop(remaining1: List[N], remaining2: List[N], acc: N): N =
    (remaining1, remaining2) match {
      case (x :: tail1, y :: tail2) =>
        loop(
          remaining1 = tail1,
          remaining2 = tail2,
          acc + (x * y)
        )

      case (Nil, _) | (_, Nil) =>
        acc
    }

  loop(
    remaining1 = v1,
    remaining2 = v2,
    acc = Numeric[N].zero
  )
}

def matrixVectorProduct[N : Numeric](matrix: List[List[N]], vector: List[N]): List[N] =
  matrix.map(row => vectorDotProduct(vector, row))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...