Идиоматический способ создания массива / списка на основе предыдущего индекса в Scala

#scala

#scala

Вопрос:

Я пытаюсь построить временной ряд, используя формулу авторегрессии в Scala. Уравнение учитывает предшествующий индекс целевого массива и текущий индекс двух других массивов. Пример фиктивного уравнения: z_i = z[i-1] - x[i] y[i]

Это просто в императивном стиле (см. Пример C ниже), но я пытаюсь выяснить идиоматический способ в Scala. Я создал решение с while циклом, но оно кажется неуклюжим и не масштабируемым.

 #include <vector>
#include <iostream>

int main() {
  std::vector<int> x {1, 2, 3, 4};
  std::vector<int> y {10, 9, 8, 7};
  std::vector<int> z {0, 0, 0, 0};

  for(int i = 1; i < x.size(); i  ) {
      z[i] = z[i-1] - x[i]   y[i];
  }

  for(auto i: z) {
      std::cout << i << std::endl;
  }
}

  
 // Desired result
[0, 7, 12, 15]
  

Ответ №1:

Вместо изменения существующего z , вы захотите создать его из x и y .

 val x = Vector(1, 2, 3, 4)
val y = Vector(10, 9, 8, 7)
val z = (x.tail zip y.tail).scanLeft(0){case (nz,(nx,ny)) => nz - nx   ny}
//z: Vector[Int] = Vector(0, 7, 12, 15)