首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转换参数使vDSP API快速编译

转换参数使vDSP API快速编译
EN

Stack Overflow用户
提问于 2014-06-09 02:47:05
回答 3查看 1.2K关注 0票数 5

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

代码语言:javascript
复制
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)
}

错误:

代码语言:javascript
复制
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) – 

我试着摆脱它,但到目前为止,没有运气。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-14 05:52:29

我做了几次调整。注意,第一个param没有符号(CConstPointer)。然而,第二种方法(我对src &dst使用相同的指针)。我也取代了价值观的铸造(必要)。您需要使用CFloats作为上限值。以下是代码:

代码语言:javascript
复制
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))

}
票数 0
EN

Stack Overflow用户

发布于 2014-06-12 03:23:23

好吧,我想出了一个(可能不太理想)的解决方案。我决定连接到目标C(并使用了稍微不同的功能)。

main.swift

代码语言:javascript
复制
import Foundation
func abs(x: matrix) -> matrix{
    let N = x.count
    var arg1 = NSArray(array: x)

    var yy = abs_objc(arg1, CInt(N))

    var y = zeros(N)
    for i in 0..N{
        y[i] = Double(yy[i])
    }
    return y

abs_objc.m

代码语言:javascript
复制
#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;
}

swix-Bridging-Header.h

代码语言:javascript
复制
#import <Foundation/Foundation.h>
double* abs_objc(NSArray * x, int N);
票数 1
EN

Stack Overflow用户

发布于 2014-06-14 05:26:47

我一直在使用vDSP来创建一个通用的矩阵语言。

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

希望您发现它是有用的(这也可能不是最佳的,而是一个开始)。

代码语言:javascript
复制
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
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24113029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档