#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)