Использование vDSP.convertElements с vDSP.RoundingMode

Я пытаюсь округлить все элементы в векторе, используя новую статическую функцию convertElements из фреймворка Accelerate.

К сожалению, я не знаю, как его использовать.

Вот что я пробовал:

let a: [Double] = [10.6, 20, 30.8, 40, 50, 60, 70, 80, 90, 100]
var b = [Int](repeating: 0, count: a.count)
var round: vDSP.RoundingMode = vDSP.RoundingMode.towardNearestInteger
vDSP.convertElements(of: a, to: &b, rounding: round)

Этот код выдает ошибку:

ошибка: неоднозначная ссылка на статический метод «convertElements(of:to:rounding:)» vDSP.convertElements(of: a, to: &b, rounding: vDSP.RoundingMode.towardNearestInteger)

Любая идея, как использовать эту функцию?

Похоже, проблема заключается в установке значения типа vDSP.RoundingMode.


person AESTHETICS    schedule 31.12.2019    source источник


Ответы (1)


Вы используете неправильный тип для массива to:. Должно быть [Int32], а не [Int].

Изменять:

var b = [Int](repeating: 0, count: a.count)

to:

var b = [Int32](repeating: 0, count: a.count)

В предоставленной вами ссылке определение функции:

static func convertElements<U, V>(of source: U, to destination: inout V,
    rounding: vDSP.RoundingMode) where U : AccelerateBuffer,
    V : AccelerateMutableBuffer, U.Element == Double, V.Element == Int32

Обратите внимание, что V.Element равно Int32.

Как отметил @MartinR в комментариях, возможны и другие типы, включая Int8, UInt8, Int16, UInt16 и UInt32. Все вызовы подробно описаны здесь.

person vacawama    schedule 31.12.2019
comment
Это также может быть массив Int16 или Int8. Все возможные комбинации можно найти здесь: developer.apple.com/documentation/accelerate/vdsp- СНВ. - person Martin R; 31.12.2019