Kotlin: математика на одномерных массивах - PullRequest
0 голосов
/ 30 апреля 2020

В Kotlin мне нужно сделать что-то вроде:

array1 = cos(angle)*array1 + sin(angle)*array2

1d массивов.

Это просто?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2020

Kotlin не может выполнять операции с целым массивом «из коробки», но вы можете легко выполнить их, предварительно определив несколько функций расширения. Например:

operator fun Double.times(array: DoubleArray)
    = DoubleArray(array.size){ this * array[it] }

operator fun DoubleArray.plus(other: DoubleArray): DoubleArray {
    require(size == other.size)
    return DoubleArray(size){ this[it] + other[it] }
}

Определяет перегрузки для операторов + и * для комбинаций Double / DoubleArray, что позволяет писать код, например:

fun main() {
    val array1 = DoubleArray(10){ it.toDouble() }
    val array2 = DoubleArray(10){ it.toDouble() * 2 }

    val array3 = 10.0 * array1 + 20.0 * array2
    println(array3.joinToString())
}

Возможно, вы захотите определить аналогичные функции расширения для умножения, где скаляр идет вторым, вычитание массивов, деление на скаляр и тоже c, но я уверен, что вы видите, как они будут работать.

Проверка require() дает IllegalArgumentException во время выполнения, если вы пытаетесь добавить два массива разной длины. (Нет простого способа проверить это во время компиляции.)

(Есть небольшая хитрость в том, что уже есть оператор + для массивов, но он объединяет их вместо выполнения арифметики c. К счастью, определение нашего здесь отменяет это.)

0 голосов
/ 30 апреля 2020

Мне немного неясно, что именно вы спрашиваете. Но если вы хотите, например, массив, который имеет все результаты уравнения от 0 до 359 в градусах, вы можете сделать что-то вроде этого:

    val array = DoubleArray(360) { i ->
        val angle = i / 180.0 * PI
        cos(angle) + sin(angle)
    }

Если бы у вас было несколько массивов одного размера Вы можете использовать их значения в другом:

    val array = DoubleArray(360) { i ->
        val angle = i / 180.0 * PI
        cos(angle) * array1[i] + sin(angle) * array2[i]
    }

Редактировать на основе комментария:

Если вы хотите заменить значения в существующем массиве:

    for (i in array1.indices) {
        val angle = i / 180.0 * PI
        array1[i] = cos(angle) * array1[i] + sin(angle) * array2[i]
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...