2016-02-05 2 views
1

Я пытаюсь использовать функцию vDSP_conv в Accelerate here. Один из аргументов vDSP_conv - это const float *__F, который «должен указывать на последний элемент вектора». Я не очень хорошо знаком с указателями в Swift, поэтому я не понимаю, как создать указатель на последний элемент массива Swift.UnsafePointer для последнего элемента массива в Swift

Может ли кто-нибудь дать представление?

/** EDIT **/

спецификация Функция, которую я пытаюсь позвонить: func vDSP_conv(_ __A: UnsafePointer<Float>, _ __IA: vDSP_Stride, _ __F: UnsafePointer<Float>, _ __IF: vDSP_Stride, _ __C: UnsafeMutablePointer<Float>, _ __IC: vDSP_Stride, _ __N: vDSP_Length, _ __P: vDSP_Length)

До сих пор, у меня есть этот код. Мне нужно y указать как указатель на последний элемент в массиве как conv начинается в конце массива и прогрессирует на фронт

public func conv(x: [Float], y: [Float]) -> [Float] { 
    var result = [Float](x) 
    let inputLength:Int = x.count 
    let outputLength:Int = inputLength + y.count - 1 
    vDSP_conv(x, 1, y, 1, &result, 1, vDSP_Length(inputLength), vDSP_Length(outputLength)) 

    return result 
} 
+0

Можете ли вы показать, что вы сделали до сих пор? –

+0

@CodeDifferent см. Редактирование в сообщении. –

ответ

1

withUnsafeBufferPointer() дает указатель на прилежащей хранения массива, из которого вы можете вычислить указатель последний элемент массива: (. Обратите внимание, что расчет длины результат массива не является правильным)

func conv(x: [Float], y: [Float]) -> [Float] { 
    var result = [Float](count: x.count - y.count + 1, repeatedValue: 0) 

    y.withUnsafeBufferPointer { bufPtr in 
     let pLast = bufPtr.baseAddress + y.count - 1 
     vDSP_conv(x, 1, pLast, -1, &result, 1, vDSP_Length(result.count), vDSP_Length(y.count)) 
    } 

    return result 
} 

Примеры:

print(conv([1, 2, 3], y: [4, 5, 6])) 
// [ 28 ] = [ 1 * 6 + 2 * 5 + 3 * 6 ] 

print(conv([1, 2, 3], y: [4, 5])) 
// [ 13, 22 ] = [ 1 * 5 + 2 * 4, 2 * 5 + 3 * 4 ] 
+0

Спасибо за решение и спасибо за то, что вы подняли проблему с массивом результатов! –

Смежные вопросы