iOS SDKのvDSP APIリファレンスのメモ - その1

iOS SDKに付属する **vDSP API** の関数の種類がめちゃくちゃ多いので整理。

公式リファレンスは以下から。
[vDSP Reference - iOS Developer Library](https://developer.apple.com/library/ios/documentation/Accelerate/Reference/vDSPRef/Reference/reference.html "vDSP Reference")

一部、引数の表記を公式リファレンスから変更しています。
ヘッダファイル(vDSP.h)を参考にして、const が抜けているものを追加したり、
統一性を優先して引数名を意図的に変えました。

<br />

今回紹介する全ての関数を実行するサンプルコードをGitHubに載せています。
[yuichiroharai/vDSP-sample - GitHub](https://github.com/yuichiroharai/vDSP-sample)

<br />

簡単なものから順に何回かに分けてメモしていきます。

## 並べ替え

### 入れ替え

#### vDSP_vswap
```c
void vDSP_vswap (
   float *__vDSP_A,
   vDSP_Stride __vDSP_I,
   float *__vDSP_B,
   vDSP_Stride __vDSP_J,
   vDSP_Length __vDSP_N
);
```

#### vDSP_vswapD
```c
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` の中身を入れ替えます。

<br />

### 反転

#### vDSP_vrvrs
```c
void vDSP_vrvrs (
   float *__vDSP_C,
   vDSP_Stride __vDSP_K,
   vDSP_Length __vDSP_N
);
```
#### vDSP_vrvrsD
```c
void vDSP_vrvrsD (
   double *__vDSP_C,
   vDSP_Stride __vDSP_K,
   vDSP_Length __vDSP_N
);
```

配列 `__vDSP_C` の各要素の並びを **反転** します。
入力と出力が同じ配列になります。

<br />

### ソート

#### vDSP_vsort
```c
void vDSP_vsort (
   float *__vDSP_C,
   vDSP_Length __vDSP_N,
   int __vDSP_OFLAG
);
```

#### vDSP_vsortD
```c
void vDSP_vsortD (
   double *__vDSP_C,
   vDSP_Length __vDSP_N,
   int __vDSP_OFLAG
);
```

配列 `__vDSP_C` の各要素の並びを **ソート** します。
フラグ `__vDSP_OFLAG` が **1** の場合は **昇順** になり **-1** の場合は **降順** になります。
入力と出力が同じ配列になります。

<br />

### インデックスソート

#### vDSP_vsorti
```c
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
```c
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** を渡します。

<br />

## 値埋め / 値消去

### 値埋め

#### vDSP_vfill
```c
void vDSP_vfill (
   const float *__vDSP_A,
   float *__vDSP_C,
   vDSP_Stride __vDSP_K,
   vDSP_Length __vDSP_N
);
```

#### vDSP_vfillD
```c
void vDSP_vfillD (
   const double *__vDSP_A,
   double *__vDSP_C,
   vDSP_Stride __vDSP_K,
   vDSP_Length __vDSP_N
);
```

#### vDSP_vfilli
```c
void vDSP_vfilli (
   const int *__vDSP_A,
   int *__vDSP_C,
   vDSP_Stride __vDSP_K,
   vDSP_Length __vDSP_N
);
```

配列 `__vDSP_C` の各要素を値 `__vDSP_A` で埋めます。

<br />

### 値消去

#### vDSP_vclr
```c
void vDSP_vclr (
   float *__vDSP_C,
   vDSP_Stride __vDSP_K,
   vDSP_Length __vDSP_N
);
```

#### vDSP_vclrD
```c
void vDSP_vclrD (
   double *__vDSP_C,
   vDSP_Stride __vDSP_K,
   vDSP_Length __vDSP_N
);
```

配列 `__vDSP_C` の各要素を値 **0** で埋めます。

<br />

## 絶対値 / 符号反転 / 小数部

### 正の絶対値

#### vDSP_vabs
```c
void vDSP_vabs (
   const float *__vDSP_A,
   vDSP_Stride __vDSP_I,
   float *__vDSP_C,
   vDSP_Stride __vDSP_K,
   vDSP_Length __vDSP_N
);
```

#### vDSP_vabsD
```c
void vDSP_vabsD (
   const double *__vDSP_A,
   vDSP_Stride __vDSP_I,
   double *__vDSP_C,
   vDSP_Stride __vDSP_K,
   vDSP_Length __vDSP_N
);
```

#### vDSP_vabsi
```c
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` の各要素に格納します。

<br />

### 負の絶対値

#### vDSP_vnabs
```c
void vDSP_vnabs (
   const float *__vDSP_A,
   vDSP_Stride __vDSP_I,
   float *__vDSP_C,
   vDSP_Stride __vDSP_K,
   vDSP_Length __vDSP_N
);
```

#### vDSP_vnabsD
```c
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` の各要素に格納します。

<br />

### 符号反転

#### vDSP_vneg
```c
void vDSP_vneg (
   const float *__vDSP_A,
   vDSP_Stride __vDSP_I,
   float *__vDSP_C,
   vDSP_Stride __vDSP_K,
   vDSP_Length __vDSP_N
);
```

#### vDSP_vnegD
```c
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` の各要素に格納します。

<br />

### 小数部

#### vDSP_vfrac
```c
void vDSP_vfrac (
   const float *__vDSP_A,
   vDSP_Stride __vDSP_I,
   float *__vDSP_C,
   vDSP_Stride __vDSP_K,
   vDSP_Length __vDSP_N
);
```

#### vDSP_vfracD
```c
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** になります。_

<br />

## 二乗

### 符号なし二乗

#### vDSP_vsq
```c
void vDSP_vsq (
   const float *__vDSP_A,
   vDSP_Stride __vDSP_I,
   float *__vDSP_C,
   vDSP_Stride __vDSP_K,
   vDSP_Length __vDSP_N
);
```

#### vDSP_vsqD
```c
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` の各要素に格納します。

<br />

### 符号あり二乗

#### vDSP_vssq
```c
void vDSP_vssq (
   const float *__vDSP_A,
   vDSP_Stride __vDSP_I,
   float *__vDSP_C,
   vDSP_Stride __vDSP_K,
   vDSP_Length __vDSP_N
);
```

#### vDSP_vssqD
```c
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` の各要素に格納します。
ただし、 **元が負の値の場合は結果も負の値** になります。

<br />

次回は四則演算辺りをまとめる予定です。