iOS SDKに付属する vDSP API の関数の種類がめちゃくちゃ多いので整理。
公式リファレンスは以下から。
vDSP Reference - iOS Developer Library
一部、引数の表記を公式リファレンスから変更しています。
ヘッダファイル(vDSP.h)を参考にして、const が抜けているものを追加したり、
統一性を優先して引数名を意図的に変えました。
今回紹介する全ての関数を実行するサンプルコードをGitHubに載せています。
yuichiroharai/vDSP-sample - GitHub
簡単なものから順に何回かに分けてメモしていきます。
並べ替え
入れ替え
vDSP_vswap
void vDSP_vswap (
float *__vDSP_A,
vDSP_Stride __vDSP_I,
float *__vDSP_B,
vDSP_Stride __vDSP_J,
vDSP_Length __vDSP_N
);
vDSP_vswapD
void vDSP_vswapD (
double *__vDSP_A,
vDSP_Stride __vDSP_I,
double *__vDSP_B,
vDSP_Stride __vDSP_J,
vDSP_Length __vDSP_N
);
配列 __vDSP_A
と配列 __vDSP_B
の中身を入れ替えます。
反転
vDSP_vrvrs
void vDSP_vrvrs (
float *__vDSP_C,
vDSP_Stride __vDSP_K,
vDSP_Length __vDSP_N
);
vDSP_vrvrsD
void vDSP_vrvrsD (
double *__vDSP_C,
vDSP_Stride __vDSP_K,
vDSP_Length __vDSP_N
);
配列 __vDSP_C
の各要素の並びを 反転 します。
入力と出力が同じ配列になります。
ソート
vDSP_vsort
void vDSP_vsort (
float *__vDSP_C,
vDSP_Length __vDSP_N,
int __vDSP_OFLAG
);
vDSP_vsortD
void vDSP_vsortD (
double *__vDSP_C,
vDSP_Length __vDSP_N,
int __vDSP_OFLAG
);
配列 __vDSP_C
の各要素の並びを ソート します。
フラグ __vDSP_OFLAG
が 1 の場合は 昇順 になり -1 の場合は 降順 になります。
入力と出力が同じ配列になります。
インデックスソート
vDSP_vsorti
void vDSP_vsorti (
const float *__vDSP_C,
vDSP_Length *__vDSP_IC,
vDSP_Length *__vDSP_List_addr,
vDSP_Length __vDSP_N,
int __vDSP_OFLAG
);
vDSP_vsortiD
void vDSP_vsortiD (
const double *__vDSP_C,
vDSP_Length *__vDSP_IC,
vDSP_Length *__vDSP_List_addr,
vDSP_Length __vDSP_N,
int __vDSP_OFLAG
);
配列 __vDSP_C
の各要素を比較し、配列 __vDSP_IC
の各要素の並びを ソート します。
あらかじめ、配列 __vDSP_IC
の中身を 0, 1, ... , __vDSP_N-1
にしておくと、インデックス番号のソートになります。
配列 __vDSP_C
の中身は変更されません。
フラグ __vDSP_OFLAG
が 1 の場合は 昇順 になり -1 の場合は 降順 になります。
__vDSP_List_addr
は使用されないので NULL を渡します。
値埋め / 値消去
値埋め
vDSP_vfill
void vDSP_vfill (
const float *__vDSP_A,
float *__vDSP_C,
vDSP_Stride __vDSP_K,
vDSP_Length __vDSP_N
);
vDSP_vfillD
void vDSP_vfillD (
const double *__vDSP_A,
double *__vDSP_C,
vDSP_Stride __vDSP_K,
vDSP_Length __vDSP_N
);
vDSP_vfilli
void vDSP_vfilli (
const int *__vDSP_A,
int *__vDSP_C,
vDSP_Stride __vDSP_K,
vDSP_Length __vDSP_N
);
配列 __vDSP_C
の各要素を値 __vDSP_A
で埋めます。
値消去
vDSP_vclr
void vDSP_vclr (
float *__vDSP_C,
vDSP_Stride __vDSP_K,
vDSP_Length __vDSP_N
);
vDSP_vclrD
void vDSP_vclrD (
double *__vDSP_C,
vDSP_Stride __vDSP_K,
vDSP_Length __vDSP_N
);
配列 __vDSP_C
の各要素を値 0 で埋めます。
絶対値 / 符号反転 / 小数部
正の絶対値
vDSP_vabs
void vDSP_vabs (
const float *__vDSP_A,
vDSP_Stride __vDSP_I,
float *__vDSP_C,
vDSP_Stride __vDSP_K,
vDSP_Length __vDSP_N
);
vDSP_vabsD
void vDSP_vabsD (
const double *__vDSP_A,
vDSP_Stride __vDSP_I,
double *__vDSP_C,
vDSP_Stride __vDSP_K,
vDSP_Length __vDSP_N
);
vDSP_vabsi
void vDSP_vabsi (
const int *__vDSP_A,
vDSP_Stride __vDSP_I,
int *__vDSP_C,
vDSP_Stride __vDSP_K,
vDSP_Length __vDSP_N
);
配列 __vDSP_A
の各要素の 絶対値 を配列 __vDSP_C
の各要素に格納します。
負の絶対値
vDSP_vnabs
void vDSP_vnabs (
const float *__vDSP_A,
vDSP_Stride __vDSP_I,
float *__vDSP_C,
vDSP_Stride __vDSP_K,
vDSP_Length __vDSP_N
);
vDSP_vnabsD
void vDSP_vnabsD (
const double *__vDSP_A,
vDSP_Stride __vDSP_I,
double *__vDSP_C,
vDSP_Stride __vDSP_K,
vDSP_Length __vDSP_N
);
配列 __vDSP_A
の各要素の 絶対値 に -1 を掛けた値を配列 __vDSP_C
の各要素に格納します。
符号反転
vDSP_vneg
void vDSP_vneg (
const float *__vDSP_A,
vDSP_Stride __vDSP_I,
float *__vDSP_C,
vDSP_Stride __vDSP_K,
vDSP_Length __vDSP_N
);
vDSP_vnegD
void vDSP_vnegD (
const double *__vDSP_A,
vDSP_Stride __vDSP_I,
double *__vDSP_C,
vDSP_Stride __vDSP_K,
vDSP_Length __vDSP_N
);
配列 __vDSP_A
の各要素に -1 を掛けた値を配列 __vDSP_C
の各要素に格納します。
小数部
vDSP_vfrac
void vDSP_vfrac (
const float *__vDSP_A,
vDSP_Stride __vDSP_I,
float *__vDSP_C,
vDSP_Stride __vDSP_K,
vDSP_Length __vDSP_N
);
vDSP_vfracD
void vDSP_vfracD (
const double *__vDSP_A,
vDSP_Stride __vDSP_I,
double *__vDSP_C,
vDSP_Stride __vDSP_K,
vDSP_Length __vDSP_N
);
配列 __vDSP_A
の各要素の整数部を0にして小数部と符号のみを取り出した値を __vDSP_C
の各要素に格納します。
例: -3.25 は -0.25 になります。
二乗
符号なし二乗
vDSP_vsq
void vDSP_vsq (
const float *__vDSP_A,
vDSP_Stride __vDSP_I,
float *__vDSP_C,
vDSP_Stride __vDSP_K,
vDSP_Length __vDSP_N
);
vDSP_vsqD
void vDSP_vsqD (
const double *__vDSP_A,
vDSP_Stride __vDSP_I,
double *__vDSP_C,
vDSP_Stride __vDSP_K,
vDSP_Length __vDSP_N
);
配列 __vDSP_A
の各要素の 二乗 を配列 __vDSP_C
の各要素に格納します。
符号あり二乗
vDSP_vssq
void vDSP_vssq (
const float *__vDSP_A,
vDSP_Stride __vDSP_I,
float *__vDSP_C,
vDSP_Stride __vDSP_K,
vDSP_Length __vDSP_N
);
vDSP_vssqD
void vDSP_vssqD (
const double *__vDSP_A,
vDSP_Stride __vDSP_I,
double *__vDSP_C,
vDSP_Stride __vDSP_K,
vDSP_Length __vDSP_N
);
配列 __vDSP_A
の各要素の 二乗 を配列 __vDSP_C
の各要素に格納します。
ただし、 元が負の値の場合は結果も負の値 になります。
次回は四則演算辺りをまとめる予定です。