iOS vDSP中的单矢量填充和清除

本文详细介绍了Apple vDSP库中的矢量填充与清除函数,包括vDSP_vfill、vDSP_vfillD、vDSP_vfilli、vDSP_zvfill、vDSP_vclr等函数的使用方法及实例演示。


矢量填充1  vDSP_vfill函数(float)

typedef unsigned long vDSP_Length;
typedef long          vDSP_Stride;

extern void vDSP_vfill(
    const float *__A,
    float       *__C,
    vDSP_Stride  __IA,
    vDSP_Length  __N)
        __OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_4_0);

公式:




举例:
注:传入的参数和数组给这个函数,注意数组越界问题。
    float a[1],output[8]={0};
    printf("input:\n");
    *a = 5.0;
    printf("%f ",*a);
    vDSP_vfill(a, output,1, 8);
    printf("\noutput:\n");
    for (int i=0; i<8; i++) {
        printf("%f ",output[i]);
    }

打印结果:

input:
5.000000 
output:
5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 5.000000 

修改函数参数如下:
 vDSP_vfill(a, output,1, 4);

打印结果:
input:
5.000000 
output:
5.000000 5.000000 5.000000 5.000000 0.000000 0.000000 0.000000 0.000000

修改函数参数如下:
vDSP_vfill(a, output,2, 4);

打印结果:
input:
5.000000 
output:
5.000000 0.000000 5.000000 0.000000 5.000000 0.000000 5.000000 0.000000

修改函数参数如下:
 vDSP_vfill(a, output,3, 4);

打印结果:

input:
5.000000 
output:
5.000000 0.000000 0.000000 5.000000 0.000000 0.000000 5.000000 0.000000

矢量填充2  vDSP_vfillD函数 (double)

extern void vDSP_vfillD(
    const double *__A,
    double       *__C,
    vDSP_Stride   __IC,
    vDSP_Length   __N)
        __OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_4_0);


矢量填充3  vDSP_vfilli函数 (int)


extern void vDSP_vfilli(
    const int   *__A,
    int         *__C,
    vDSP_Stride  __IC,
    vDSP_Length  __N)
        __OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_4_0);

矢量填充4  vDSP_zvfill函数 (复数float)

typedef struct DSPSplitComplex {
    float  * __nonnull realp;
    float  * __nonnull imagp;
} DSPSplitComplex;

extern void vDSP_zvfill(
    const DSPSplitComplex *__A,
    const DSPSplitComplex *__C,
    vDSP_Stride            __IC,
    vDSP_Length            __N)
        __OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_4_0);


公式:


例子:

    float ar[1]={1},ai[1]={2};
    float outr[8]={0},outi[8]={0};
    DSPSplitComplex a[1],output[1];
    a[0].imagp = ai;
    a[0].realp = ar;
    output[0].imagp = outi;
    output[0].realp = outr;
    printf("input:\n");
    printf("(%f)+(%f)i",a[0].realp[0],a[0].imagp[0]);
    vDSP_zvfill(a,output,1,8);
    printf("\noutput:\n");
    for (int i=0; i<8; i++) {
        printf("(%f)+(%f)i\n",output[0].realp[i],output[0].imagp[i]);
    }

打印结果:


input:
(1.000000)+(2.000000)i
output:
(1.000000)+(2.000000)i
(1.000000)+(2.000000)i
(1.000000)+(2.000000)i
(1.000000)+(2.000000)i
(1.000000)+(2.000000)i
(1.000000)+(2.000000)i
(1.000000)+(2.000000)i
(1.000000)+(2.000000)i


修改函数参数如下:
vDSP_zvfill(a,output,1,4);

打印结果如下:
input:
(1.000000)+(2.000000)i
output:
(1.000000)+(2.000000)i
(1.000000)+(2.000000)i
(1.000000)+(2.000000)i
(1.000000)+(2.000000)i
(0.000000)+(0.000000)i
(0.000000)+(0.000000)i
(0.000000)+(0.000000)i
(0.000000)+(0.000000)i

修改函数参数如下:
vDSP_zvfill(a,output,2,4);

打印结果如下:
input:
(1.000000)+(2.000000)i
output:
(1.000000)+(2.000000)i
(0.000000)+(0.000000)i
(1.000000)+(2.000000)i
(0.000000)+(0.000000)i
(1.000000)+(2.000000)i
(0.000000)+(0.000000)i
(1.000000)+(2.000000)i
(0.000000)+(0.000000)i

矢量填充5  vDSP_zvfillD函数 (复数double)

typedef struct DSPDoubleSplitComplex {
    double * __nonnull realp;
    double * __nonnull imagp;
} DSPDoubleSplitComplex;


extern void vDSP_zvfillD(
    const DSPDoubleSplitComplex *__A,
    const DSPDoubleSplitComplex *__C,
    vDSP_Stride                  __IC,
    vDSP_Length                  __N)
        __OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_4_0);

矢量清除6 vDSP_vclr函数 (float)


extern void vDSP_vclr(
    float       *__C,
    vDSP_Stride  __IC,
    vDSP_Length  __N)
        __OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_4_0);

函数计算:

for (n = 0; n < N; ++n)
           C[n] = 0;

例子:

    float input[8];
    printf("input:\n");
    for (int i=1; i<=8; i++) {
        input[i-1]=-i;
        printf("%f ",input[i-1]);
    }
    vDSP_vclr(input, 1, 8);
    printf("\noutput:\n");
    for (int i=0; i<8; i++) {
        printf("%f ",input[i]);
    }

打印结果:
input:
-1.000000 -2.000000 -3.000000 -4.000000 -5.000000 -6.000000 -7.000000 -8.000000 
output:
0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 

修改函数参数如下:
 vDSP_vclr(input, 1, 5);
打印结果:

input:
-1.000000 -2.000000 -3.000000 -4.000000 -5.000000 -6.000000 -7.000000 -8.000000 
output:
0.000000 0.000000 0.000000 0.000000 0.000000 -6.000000 -7.000000 -8.000000 


矢量清除7  vDSP_vclrD函数 (double)

extern void vDSP_vclrD(
    double      *__C,
    vDSP_Stride  __IC,
    vDSP_Length  __N)
        __OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_4_0);




祝您生活愉快!









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

u014068781

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值