iOS vDSP中的单矢量生成

来源:互联网 发布:人工智能电影观后感 编辑:程序博客网 时间:2024/06/01 23:04

注:注意数组越界问题。

vDSP_Length和vDSP_Stride数据类型:

typedef unsigned long vDSP_Length;typedef long          vDSP_Stride;

矢量生成 vDSP_vramp方法

    extern void vDSP_vramp(    const float *__A,    const float *__B,    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] = A[0] + n*B[0];

函数使用例子:

float A[1]={3},B[1]={2};    float C[8]={0};    printf("input:\n");    printf("A:%f B:%f",A[0],B[0]);    vDSP_vramp(A, B, C, 1,8);    printf("\nvDSP_vramp(A,B,C,1,8) C:\n");    for (int i=0; i<8; i++) {        printf("%f ",C[i]);        C[i]=0;    }        vDSP_vramp(A, B, C, 2,4);    printf("\nvDSP_vramp(A,B,C,2,4) C\n");    for (int i=0; i<8; i++) {        printf("%f ",C[i]);        C[i]=0;    }        vDSP_vramp(A, B, C, 1,4);    printf("\nvDSP_vramp(A,B,C,1,4) C:\n");    for (int i=0; i<8; i++) {        printf("%f ",C[i]);    }



输出结果如下:

input:
A:3.000000 B:2.000000
vDSP_vramp(A,B,C,1,8) C:
3.000000 5.000000 7.000000 9.000000 11.000000 13.000000 15.000000 17.000000 
vDSP_vramp(A,B,C,2,4) C
3.000000 0.000000 5.000000 0.000000 7.000000 0.000000 9.000000 0.000000 
vDSP_vramp(A,B,C,1,4) C:
3.000000 5.000000 7.000000 9.000000 0.000000 0.000000 0.000000 0.000000 


矢量生成  vDSP_vrampD方法

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

方法算法:
        
    for (n = 0; n < N; ++n)        C[n] = A[0] + n*B[0];

矢量生成 vDSP_vrampmul方法

    void vDSP_vrampmul(    const float *__I, vDSP_Stride __IS,    float *__Start,    const float *__Step,    float *__O, vDSP_Stride __OS,    vDSP_Length __N)        __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_4_0);


方法算法:

     for (i = 0; i < N; ++i){          O[i*OS] = *Start * I[i*IS];          *Start += *Step;     }

方法使用例子:

float start=0,step=2;    float I[8],O[8]={0};    printf("input:\n");    for(int i=0;i<8;i++){        I[i]=i;        printf("%f ",I[i]);    }    vDSP_vrampmul(I,1, &start, &step, O, 1, 8);    printf("\nvDSP_vrampmul(I,1, &start, &step, O, 1, 8) O:\n");    for(int i=0;i<8;i++){        printf("%f ",O[i]);        O[i]=0;    }    start=0;step=2;    vDSP_vrampmul(I,2, &start, &step, O, 1, 4);    printf("\nvDSP_vrampmul(I,2, &start, &step, O, 1, 4) O:\n");    for(int i=0;i<8;i++){        printf("%f ",O[i]);        O[i]=0;    }    start=0;step=2;    vDSP_vrampmul(I,1, &start, &step, O, 2, 4);    printf("\nvDSP_vrampmul(I,1, &start, &step, O, 2, 4) O:\n");    for(int i=0;i<8;i++){        printf("%f ",O[i]);        O[i]=0;    }    start=0;step=2;    vDSP_vrampmul(I,1, &start, &step, O, 1, 4);    printf("\nvDSP_vrampmul(I,1, &start, &step, O, 1, 4) O:\n");    for(int i=0;i<8;i++){        printf("%f ",O[i]);    }

输出结果:
input:0.000000 1.000000 2.000000 3.000000 4.000000 5.000000 6.000000 7.000000 vDSP_vrampmul(I,1, &start, &step, O, 1, 8) O:0.000000 2.000000 8.000000 18.000000 32.000000 50.000000 72.000000 98.000000 vDSP_vrampmul(I,2, &start, &step, O, 1, 4) O:0.000000 4.000000 16.000000 36.000000 0.000000 0.000000 0.000000 0.000000 vDSP_vrampmul(I,1, &start, &step, O, 2, 4) O:0.000000 0.000000 2.000000 0.000000 8.000000 0.000000 18.000000 0.000000 vDSP_vrampmul(I,1, &start, &step, O, 1, 4) O:0.000000 2.000000 8.000000 18.000000 0.000000 0.000000 0.000000 0.000000 


矢量生成 vDSP_vrampmulD方法

void vDSP_vrampmulD(    const double *__I, vDSP_Stride __IS,    double *__Start,    const double *__Step,    double *__O, vDSP_Stride __OS,    vDSP_Length __N)        __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0);



vDSP_vrampmulD方法计算方式:

     for (i = 0; i < N; ++i){          O[i*OS] = *Start * I[i*IS];          *Start += *Step;     }

矢量生成 vDSP_vrampmul_s1_15方法

void vDSP_vrampmul_s1_15(    const short int *__I, vDSP_Stride __IS,    short int *__Start,    const short int *__Step,    short int *__O, vDSP_Stride __OS,    vDSP_Length __N)        __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_4_0);

方法算法:

     for (i = 0; i < N; ++i){          O[i*OS] = (*Start * I[i*IS])/32768;//(2的15次方32768)          *Start += *Step;     }

例子:

short int start=1,step=2;    short int I[8],O[8]={0};    printf("input:\n");    for(short int i=0;i<8;i++){        I[i]=32768/2;        printf("%d ",I[i]);    }    vDSP_vrampmul_s1_15(I,1, &start, &step, O, 1, 8);    printf("\n(I,1, &start, &step, O, 1, 8) O:\n");    for(int i=0;i<8;i++){        printf("%d ",O[i]);        O[i]=0;    }    start=1;step=2;    vDSP_vrampmul_s1_15(I,2, &start, &step, O, 1, 4);    printf("\n(I,2, &start, &step, O, 1, 4) O:\n");    for(int i=0;i<8;i++){        printf("%d ",O[i]);        O[i]=0;    }    start=1;step=2;    vDSP_vrampmul_s1_15(I,1, &start, &step, O, 2, 4);    printf("\n(I,1, &start, &step, O, 2, 4) O:\n");    for(int i=0;i<8;i++){        printf("%d ",O[i]);        O[i]=0;    }    start=1;step=2;    vDSP_vrampmul_s1_15(I,1, &start, &step, O, 1, 4);    printf("\n(I,1, &start, &step, O, 1, 4) O:\n");    for(int i=0;i<8;i++){        printf("%d ",O[i]);    }



打印结果:

input:
16384 16384 16384 16384 16384 16384 16384 16384 
(I,1, &start, &step, O, 1, 8) O:
0 1 2 3 4 5 6 7 
(I,2, &start, &step, O, 1, 4) O:
0 1 2 3 0 0 0 0 
(I,1, &start, &step, O, 2, 4) O:
0 0 1 0 2 0 3 0 
(I,1, &start, &step, O, 1, 4) O:
0 1 2 3 0 0 0 0 



矢量生成  vDSP_vrampmul_s8_24方法

void vDSP_vrampmul_s8_24(    const int *__I, vDSP_Stride __IS,    int *__Start,    const int *__Step,    int *__O, vDSP_Stride __OS,    vDSP_Length __N)        __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_4_0);

方法算法:

     for (i = 0; i < N; ++i){          O[i*OS] = (*Start * I[i*IS])/16777216;//(2的24次方16777216)          *Start += *Step;     }

矢量生成 vDSP_vrampmul2方法

void vDSP_vrampmul2(    const float *__I0, const float *__I1, vDSP_Stride __IS,    float *__Start,    const float *__Step,    float *__O0, float *__O1, vDSP_Stride __OS,    vDSP_Length __N)        __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_4_0);


方法算法:

for (i = 0; i < N; ++i) {    O0[i*OS] = *Start * I0[i*IS];    O1[i*OS] = *Start * I1[i*IS];    *Start += *Step;}


矢量生成  vDSP_vrampmul2D方法


void vDSP_vrampmul2D(    const double *__I0, const double *__I1, vDSP_Stride __IS,          double *__Start,    const double *__Step,          double *__O0, double *__O1, vDSP_Stride __OS,    vDSP_Length __N)        __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0);


方法算法:

for (i = 0; i < N; ++i) {    O0[i*OS] = *Start * I0[i*IS];    O1[i*OS] = *Start * I1[i*IS];    *Start += *Step;}


矢量生成  vDSP_vrampmul2_s1_15方法

void vDSP_vrampmul2_s1_15(    const short int *__I0, const short int *__I1, vDSP_Stride __IS,    short int *__Start,    const short int *__Step,    short int *__O0, short int *__O1, vDSP_Stride __OS,    vDSP_Length __N)        __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_4_0);

方法算法:

for (i = 0; i < N; ++i) {    O0[i*OS] = *Start * I0[i*IS]/32768;//2^15=32768    O1[i*OS] = *Start * I1[i*IS]/32768;//2^15=32768    *Start += *Step;}
<pre name="code" class="objc">

矢量生成 vDSP_vrampmul2_s8_24方法


void vDSP_vrampmul2_s8_24(    const int *__I0, const int *__I1, vDSP_Stride __IS,    int *__Start,    const int *__Step,    int *__O0, int *__O1, vDSP_Stride __OS,    vDSP_Length __N)        __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_4_0);

方法算法:

for (i = 0; i < N; ++i) {    O0[i*OS] = *Start * I0[i*IS]/16777216;//2^24=16777216    O1[i*OS] = *Start * I1[i*IS]/1677216;//2^24=16777216    *Start += *Step;}


矢量生成 vDSP_vrampmuladd 方法


void vDSP_vrampmuladd(    const float *__I, vDSP_Stride __IS,    float *__Start,    const float *__Step,    float *__O, vDSP_Stride __OS,    vDSP_Length __N)        __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_4_0);

方法算法:

for (i = 0; i < N; ++i) {    O[i*OS] += *Start * I[i*IS];    *Start += *Step;}


例子:
float start=1,step=2;    float I[8],O[8]={0};    printf("input:\n");    for(int i=0;i<8;i++){        I[i]=2;        O[i]=0;        printf("%f ",I[i]);    }    vDSP_vrampmuladd(I,1, &start, &step, O, 1, 8);    printf("\n(I,1, &start, &step, O, 1, 8) O:\n");    for(int i=0;i<8;i++){        printf("%f ",O[i]);        O[i]=1;    }    start=1;step=2;    vDSP_vrampmuladd(I,1, &start, &step, O, 1, 8);    printf("\n(I,1, &start, &step, O, 1, 8) O:\n");    for(int i=0;i<8;i++){        printf("%f ",O[i]);        O[i]=2;    }    start=1;step=2;    vDSP_vrampmuladd(I,1, &start, &step, O, 1, 8);    printf("\n(I,1, &start, &step, O, 1, 8) O:\n");    for(int i=0;i<8;i++){        printf("%f ",O[i]);        O[i]=3;    }    start=1;step=2;    vDSP_vrampmuladd(I,1, &start, &step, O, 1, 8);    printf("\n(I,1, &start, &step, O, 1, 8) O:\n");    for(int i=0;i<8;i++){        printf("%f ",O[i]);    }


输出结果:

input:2.000000 2.000000 2.000000 2.000000 2.000000 2.000000 2.000000 2.000000 (I,1, &start, &step, O, 1, 8) O:2.000000 6.000000 10.000000 14.000000 18.000000 22.000000 26.000000 30.000000 (I,1, &start, &step, O, 1, 8) O:3.000000 7.000000 11.000000 15.000000 19.000000 23.000000 27.000000 31.000000 (I,1, &start, &step, O, 1, 8) O:4.000000 8.000000 12.000000 16.000000 20.000000 24.000000 28.000000 32.000000 (I,1, &start, &step, O, 1, 8) O:5.000000 9.000000 13.000000 17.000000 21.000000 25.000000 29.000000 33.000000 


矢量生成 vDSP_vrampmuladdD方法

void vDSP_vrampmuladdD(    const double *__I, vDSP_Stride __IS,          double *__Start,    const double *__Step,          double *__O, vDSP_Stride __OS,    vDSP_Length __N)        __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0);

方法算法:

for (i = 0; i < N; ++i) {    O[i*OS] += *Start * I[i*IS];    *Start += *Step;}

矢量生成 vDSP_vrampmul_s1_15方法

void vDSP_vrampmuladd_s1_15(    const short int *__I, vDSP_Stride __IS,    short int *__Start,    const short int *__Step,    short int *__O, vDSP_Stride __OS,    vDSP_Length __N)        __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_4_0);

方法算法:

for (i = 0; i < N; ++i) {    O[i*OS] += (*Start * I[i*IS])/32768;//2^15=32768    *Start += *Step;}

例子:

short int start=1,step=2;    short int I[8],O[8]={0};    printf("input:\n");    for(int i=0;i<8;i++){        I[i]=32768/2;        O[i]=32768-8;        printf("%d ",I[i]);    }    vDSP_vrampmuladd_s1_15(I,1, &start, &step, O, 1, 8);    printf("\n(I,1, &start, &step, O, 1, 8) O:\n");    for(int i=0;i<8;i++){        printf("%d ",O[i]);        O[i]=32768-9;    }    start=1;step=2;    vDSP_vrampmuladd_s1_15(I,1, &start, &step, O, 1, 8);    printf("\n(I,1, &start, &step, O, 1, 8) O:\n");    for(int i=0;i<8;i++){        printf("%d ",O[i]);        O[i]=32768-10;    }    start=1;step=2;    vDSP_vrampmuladd_s1_15(I,1, &start, &step, O, 1, 8);    printf("\n(I,1, &start, &step, O, 1, 8) O:\n");    for(int i=0;i<8;i++){        printf("%d ",O[i]);        O[i]=32768-100;    }    start=1;step=2;    vDSP_vrampmuladd_s1_15(I,1, &start, &step, O, 1, 8);    printf("\n(I,1, &start, &step, O, 1, 8) O:\n");    for(int i=0;i<8;i++){        printf("%d ",O[i]);    }


输出结果:

input:
16384 16384 16384 16384 16384 16384 16384 16384 
(I,1, &start, &step, O, 1, 8) O:
32760 32761 32762 32763 32764 32765 32766 32767 
(I,1, &start, &step, O, 1, 8) O:
32759 32760 32761 32762 32763 32764 32765 32766 
(I,1, &start, &step, O, 1, 8) O:
32758 32759 32760 32761 32762 32763 32764 32765 
(I,1, &start, &step, O, 1, 8) O:
32668 32669 32670 32671 32672 32673 32674 32675 


矢量生成  vDSP_vrampmuladd_s8_24方法


void vDSP_vrampmuladd_s8_24(    const int *__I, vDSP_Stride __IS,    int *__Start,    const int *__Step,    int *__O, vDSP_Stride __OS,    vDSP_Length __N)        __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_4_0);

方法算法:

for (i = 0; i < N; ++i) {    O[i*OS] += (*Start * I[i*IS])/16777216;//2^24=16777216    *Start += *Step;}


矢量生成 vDSP_vrampmuladd2方法

void vDSP_vrampmuladd2(    const float *__I0, const float *__I1, vDSP_Stride __IS,    float *__Start,    const float *__Step,    float *__O0, float *__O1, vDSP_Stride __OS,    vDSP_Length __N)        __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_4_0);

方法算法:

for (i = 0; i < N; ++i){      O0[i*OS] += *Start * I0[i*IS];      O1[i*OS] += *Start * I1[i*IS];      *Start += *Step;}


矢量生成 vDSP_vrampmuladd2D方法


void vDSP_vrampmuladd2D(    const double *__I0, const double *__I1, vDSP_Stride __IS,    double *__Start,    const double *__Step,    double *__O0, double *__O1, vDSP_Stride __OS,    vDSP_Length __N)        __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0);

方法算法:

for (i = 0; i < N; ++i){      O0[i*OS] += *Start * I0[i*IS];      O1[i*OS] += *Start * I1[i*IS];      *Start += *Step;}

矢量生成 vDSP_vrampmul2_s1_15方法

void vDSP_vrampmul2_s1_15(    const short int *__I0, const short int *__I1, vDSP_Stride __IS,    short int *__Start,    const short int *__Step,    short int *__O0, short int *__O1, vDSP_Stride __OS,    vDSP_Length __N)        __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_4_0);

方法算法:

for (i = 0; i < N; ++i){      O0[i*OS] += *Start * I0[i*IS]/32768;//2^15=32768      O1[i*OS] += *Start * I1[i*IS]/32768;//2^15=32768      *Start += *Step;}


矢量生成 vDSP_vrampmul2_s8_24方法


void vDSP_vrampmul2_s8_24(    const int *__I0, const int *__I1, vDSP_Stride __IS,    int *__Start,    const int *__Step,    int *__O0, int *__O1, vDSP_Stride __OS,    vDSP_Length __N)        __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_4_0);


方法算法:

for (i = 0; i < N; ++i){      O0[i*OS] += *Start * I0[i*IS]/16777216;//2^24=16777216      O1[i*OS] += *Start * I1[i*IS]/16777216;//2^24=16777216      *Start += *Step;}


矢量生成 vDSP_vgen方法 生成锥形轨道

extern void vDSP_vgen(    const float *__A,    const float *__B,    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] = A[0] + (B[0] - A[0]) * n/(N-1);

例子:

    float A[1]={1},B[1]={3};    float C[16]={0};    printf("input:\n");    printf("A:%f B:%f",A[0],B[0]);    vDSP_vgen(A, B, C, 1,8);    printf("\nvDSP_vgen(A,B,C,1,8) C:\n");    for (int i=0; i<8; i++) {        printf("%f ",C[i]);        C[i]=0;    }        vDSP_vgen(A, B, C, 2,8);    printf("\nvDSP_vgen(A,B,C,2,8) C\n");    for (int i=0; i<8; i++) {        printf("%f ",C[i]);        C[i]=0;    }


输出结果:


input:
A:1.000000 B:3.000000
vDSP_vgen(A,B,C,1,8) C:
1.000000 1.285714 1.571429 1.857143 2.142857 2.428571 2.714286 3.000000 
vDSP_vgen(A,B,C,2,4) C
1.000000 0.000000 1.285714 0.000000 1.571429 0.000000 1.857143 0.000000 


矢量生成 vDSP_vgenD方法 生成锥形轨道


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

方法算法:

for (n = 0; n < N; ++n)     C[n] = A[0] + (B[0] - A[0]) * n/(N-1);

矢量生成 vDSP_vgenp方法 生成外推和插值

注:M是A、B的长
extern void vDSP_vgenp(    const float *__A,    vDSP_Stride  __IA,    const float *__B,    vDSP_Stride  __IB,    float       *__C,    vDSP_Stride  __IC,    vDSP_Length  __N,    vDSP_Length  __M)  // Length of A and of B.        __OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_4_0);


方法算法

for (n = 0; n < N; ++n)     If n <= B[0],  then C[n] = A[0].     If B[M-1] < n, then C[n] = A[M-1].     Otherwise:        Let m be such that B[m] < n <= B[m+1].        C[n] = A[m] + (A[m+1]-A[m]) * (n-B[m]) / (B[m+1]-B[m]).


矢量生成 vDSP_vgenpD方法 生成外推和插值

注:M是A、B的长 A,B
extern void vDSP_vgenpD(    const double *__A,    vDSP_Stride   __IA,    const double *__B,    vDSP_Stride   __IB,    double       *__C,    vDSP_Stride   __IC,    vDSP_Length   __N,    vDSP_Length   __M)  // Length of A and of B.        __OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_4_0);

方法算法

for (n = 0; n < N; ++n)     If n <= B[0],  then C[n] = A[0].     If B[M-1] < n, then C[n] = A[M-1].     Otherwise:        Let m be such that B[m] < n <= B[m+1].        C[n] = A[m] + (A[m+1]-A[m]) * (n-B[m]) / (B[m+1]-B[m]).


矢量生成  vDSP_vtabi方法 矢量查表和插值

extern void vDSP_vtabi(    const float *__A,    vDSP_Stride  __IA,    const float *__S1,    const float *__S2,    const float *__C,    vDSP_Length  __M,    float       *__D,    vDSP_Stride  __ID,    vDSP_Length  __N)        __OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_4_0);

方法算法:

 for (n = 0; n < N; ++n){      p = S1[0] * A[n] + S2[0];      if (p < 0)          D[n] = C[0];      else if (p < M-1){           q = trunc(p);           r = p-q;           D[n] = (1-r)*C[q] + r*C[q+1];      }      else           D[n] = C[M-1]; }


矢量生成  vDSP_vtabiD方法 矢量查表和插值

extern void vDSP_vtabiD(    const double *__A,    vDSP_Stride   __IA,    const double *__S1,    const double *__S2,    const double *__C,    vDSP_Length   __M,    double       *__ID,    vDSP_Stride   __L,    vDSP_Length   __N)        __OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_4_0);


方法算法:

 for (n = 0; n < N; ++n){      p = S1[0] * A[n] + S2[0];      if (p < 0)          D[n] = C[0];      else if (p < M-1){           q = trunc(p);           r = p-q;           D[n] = (1-r)*C[q] + r*C[q+1];      }      else           D[n] = C[M-1]; }














0 0
原创粉丝点击