Ios 使用vDSP API进行Swift编译的转换参数

Ios 使用vDSP API进行Swift编译的转换参数,ios,swift,accelerate-framework,Ios,Swift,Accelerate Framework,我在尝试使用Swift的带有vDSP API的加速框架时遇到了一些问题。显然我做错了什么,尽管编译器给了我各种各样的警告 var srcAsFloat:CConstPointer<CFloat> = CFloat[](count: Int(width*height), repeatedValue: 0) var dstAsFloat = CFloat[](count: Int(width*height), repeatedValue: 0) if shouldClip {

我在尝试使用Swift的带有vDSP API的加速框架时遇到了一些问题。显然我做错了什么,尽管编译器给了我各种各样的警告

var srcAsFloat:CConstPointer<CFloat> = CFloat[](count: Int(width*height), repeatedValue: 0)
var dstAsFloat = CFloat[](count: Int(width*height), repeatedValue: 0)

if shouldClip {
    var min:CFloat = 0.0
    var max:CFloat = 255.0
    var l:vDSP_Stride = Int(width*height)
    vDSP_vclip(CConstPointer<CFloat>(&dstAsFloat), vDSP_Stride(1), CConstPointer<CFloat>(&min), CConstPointer<CFloat>(&max), CMutablePointer<CFloat>(&dstAsFloat), vDSP_Stride(1), l)
}
var srcAsFloat:CConstPointer=CFloat[](计数:Int(宽度*高度),重复值:0)
var dstAsFloat=CFloat[](计数:Int(宽度*高度),重复值:0)
如果该剪{
最小变量:CFloat=0.0
变量最大值:CFloat=255.0
变量l:vDSP_步长=Int(宽度*高度)
vDSP_vclip(CConstPointer(&dstAsFloat)、vDSP_跨步(1)、CConstPointer(&min)、CConstPointer(&max)、CMutablePointer(&dstAsFloat)、vDSP_跨步(1)、l)
}
错误:

error: could not find an overload for 'init' that accepts the supplied arguments 
    vDSP_vclip(CConstPointer<CFloat>(&dstAsFloat), 
    vDSP_Stride(1), 
    CConstPointer<CFloat>(&min), 
    CConstPointer<CFloat>(&max), 
    CMutablePointer<CFloat>(&dstAsFloat), 
    vDSP_Stride(1), 
    l) – 

错误:找不到接受提供的参数的'init'的重载
vDSP_vclip(CConstPointer和dstAsFloat),
vDSP_步幅(1),
CConstPointer(&min),
CConstPointer(&max),
CMutablePointer(&dstAsFloat),
vDSP_步幅(1),
l) –
我试图摆脱它,但到目前为止,没有运气。

好的,我想出了一个(可能是次优的)解决方案。我决定连接到Objective-C(并使用了稍微不同的函数)

梅因·斯威夫特 abs_objc.m
#导入
双*abs_objc(NSArray*x,int N){
//将输入转换为双精度*
double*xx=(double*)malloc(sizeof(double)*N);

对于(inti=0;i我一直在与vDSP合作,只是为了创建一种通用的矩阵语言

我发现这种方法最容易获得正确的指针类型

希望您会发现它很有用(这可能不是最佳的,但只是一个开始)

导入加速
func myFunction(宽度:浮点,高度:浮点){
var dstAsFloat=CFloat[](计数:Int(宽度*高度),重复值:0)
最小变量:CFloat=0.0
变量最大值:CFloat=255.0
func vclipPointerConversion(dstAsFloat:CMutablePointer){
vDSP_vclip(CConstPointer(nil,dstAsFloat.value),vDSP_跨步(1),
&最小值和最大值、DSTASFALOAT、vDSP_步长(1)、C指定长度(宽度*高度))
}
vclipPointerConversion(&dstAsFloat)
//...
//你要什么就给什么
}

我对其进行了一些调整。请注意,第一个参数没有带符号(CConstPointer)。但是第二个参数有符号(我对src和dst使用相同的指针)。我还替换了值的转换(必要)。您需要对上限值使用CFloat。代码如下:

let width: UInt = CGBitmapContextGetWidth(context)
let height: UInt = CGBitmapContextGetHeight(context)

var dstAsFloat = CFloat[](count: Int(width*height), repeatedValue: 0)

if shouldClip {
    var min:CFloat = 0.0
    var max:CFloat = 255.0
    vDSP_vclip(dstAsFloat, CLong(1), &min, &max, &dstAsFloat, CLong(1), UInt(width*height))

}

您可以发布收到的警告/错误吗?错误:找不到接受提供的参数vDSP_vclip(CConstPointer(&dstAsFloat)、vDSP_Stride(1)、CConstPointer(&min)、CConstPointer(&max)、CMutablePointer(&dstAsFloat)、vDSP_Stride(1)、l)的“init”重载
#import <Accelerate/Accelerate.h>
double* abs_objc(NSArray * x, int N){
    // converting input to double *
    double * xx = (double *)malloc(sizeof(double) * N);
    for (int i=0; i<[x count]; i++) {
        xx[i] = [[x objectAtIndex:i] doubleValue];
    }

    // init'ing output
    double * y = (double *)malloc(sizeof(double) * N);
    for (int i=0; i<N; i++){
        y[i] = 0;
    }

    vDSP_vabsD(xx,1,y,1,N);

    return y;
}
#import <Foundation/Foundation.h>
double* abs_objc(NSArray * x, int N);
import Accelerate
func myFunction(width:Float, height:Float) {

    var dstAsFloat = CFloat[](count: Int(width*height), repeatedValue: 0)
    var min:CFloat = 0.0
    var max:CFloat = 255.0

    func vclipPointerConversion(dstAsFloat:CMutablePointer<CFloat>) {
        vDSP_vclip(CConstPointer<CFloat>(nil,dstAsFloat.value), vDSP_Stride(1),
            &min, &max, dstAsFloat, vDSP_Stride(1), CUnsignedLong(width*height))
    }

    vclipPointerConversion(&dstAsFloat)

    //...
    // return whatever you wanted
}
let width: UInt = CGBitmapContextGetWidth(context)
let height: UInt = CGBitmapContextGetHeight(context)

var dstAsFloat = CFloat[](count: Int(width*height), repeatedValue: 0)

if shouldClip {
    var min:CFloat = 0.0
    var max:CFloat = 255.0
    vDSP_vclip(dstAsFloat, CLong(1), &min, &max, &dstAsFloat, CLong(1), UInt(width*height))

}