Как вычислить квадрат root вектора поэлементно, используя vDSP / Accelerate in swift для iOS - PullRequest
2 голосов
/ 04 февраля 2020

У меня есть вектор, похожий на [Float](repeating: 1.0, count: 42000), и я хотел бы вычислить квадрат root каждого элемента с использованием фреймворка Accelerate, но функция vDSP_vsqrt не существует вопреки тому, что указано в Apple Accelerate Рамки масштабируют и нормализуют вектор . Как мне это сделать?

Ответы [ 3 ]

5 голосов
/ 11 февраля 2020

Оверлей vForce Swift немного упрощает синтаксис:

vForce.sqrt(vector: AccelerateBuffer)

Посмотрите на: https://github.com/apple/swift/blob/master/stdlib/public/Darwin/Accelerate/vForce_Operations.swift

... и ...

https://developer.apple.com/videos/play/wwdc2019/718/

2 голосов
/ 04 февраля 2020

Я бы рекомендовал сделать вспомогательные функции для переноса vvsqrtf, чтобы предоставить более дружественный для Swift API:

import Accelerate

extension Array where Element == Float {
    func squareRootedElements() -> [Float] {
        if self.isEmpty { return [] }

        var output = Array(repeating: 0, count: self.count)
        var count = Int32(self.count)

        vvsqrtf(&output, self, &count)

        return output
    }

    mutating func squareRootElements() {
        if self.isEmpty { return }

        var count = Int32(self.count)

        vvsqrtf(&self, self, &count)
    }
}

var squares = stride(from: 0 as Float, through: 10, by: +1).map { $0 * $0 }
print(squares)
print(squares.squareRootedElements())
2 голосов
/ 04 февраля 2020

Кажется, правильная функция для вызова - vvsqrtf из vForce.

Вот пример из документации для ее использования:

var x: [Float] = [100, 10000, 64, 144]
var y = [Float](repeating: 0, count: x.count)
var n = Int32(x.count)

vvsqrtf(&y, &x, &n)

print(y) // [10.0, 100.0, 8.0, 12.0]

Обратите внимание, что вы также можете вычислить квадрат root "на месте":

var data = [Float](repeating: 25.0, count: input.count)
let n = Int32(data.count)

vvsqrtf(&data, data, &n)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...