2016-02-05 1 views
1

J'essaie d'utiliser la fonction vDSP_conv dans Accelerate here. L'un des arguments à vDSP_conv est un const float *__F qui "doit pointer vers le dernier élément vectoriel". Je ne suis pas très familier avec l'utilisation de pointeurs dans Swift, donc je ne sais pas comment créer un pointeur sur le dernier élément d'un tableau Swift.UnsafePointer au dernier élément de tableau dans Swift

Quelqu'un peut-il donner un aperçu?

/** EDIT **/

spécification des fonctions que je suis en train d'appeler: 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)

Jusqu'à présent, j'ai ce code. Je dois y pour pointer un pointeur vers le dernier élément du tableau que conv commence à la fin du tableau et PROGRESSE à l'avant

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

Pouvez-vous montrer ce que vous avez fait jusqu'à présent? –

+0

@CodeDifferent s'il vous plaît voir modifier dans la poste. –

Répondre

1

withUnsafeBufferPointer() vous donne un pointeur vers stockage contigu du tableau, à partir de laquelle vous pouvez calculer un pointeur vers le dernier élément du tableau: (. Notez que votre calcul de la longueur du tableau de résultat n'a pas été correct)

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 
} 

Exemples:

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

Merci pour la solution et merci d'avoir également soulevé le problème avec le tableau de résultats! –