[vDSP,メモ] vDSP関数の使い方1

vDSP関数の使い方について忘れないようにメモってみます。

vDSP関数は、ベクトルや行列の計算
フーリエ解析、窓の生成などを最適化して行なってくれるフレームワークです。

事前準備
このフレームワークを使う場合
Accelerate.frameworkを以下のように追加します。
vDSP1.png

ヘッダーファイルに
#import <Accelerate/Accelerate.h>
と記述しフレームワークをimportします。

実際につかってみよう
実際にどのように使うのかテストしてみましょう。
まずは、ベクトルとベクトル同時の計算を確認してみます。
// 計算したい2つのベクトルを準備する
float inVector1[8] = {1, 2, 3, 4, 5, 6, 7, 8};
float inVector2[8] = {1, 2, 3, 4, 5, 6, 7, 8};

// 計算結果を入れる配列を準備する
float outVectorAdd[8];

// ベクトル同時の足し算を行う
vDSP_vadd(inVector1, 1, inVector2, 1, outVectorAdd, 1, 8);
結果は次のようになります。
vDSP-vadd.png

実際にこの関数について、リファレンスで調べてみましょう。
iOS版のvDSPのリファレンスは次のURLから確認する事ができます。
iOS Developer Library vDSP Reference

vDSP_vaddについて詳しくみてみましょう。
void vDSP_vadd (
   const float __vDSP_input1[],
   vDSP_Stride __vDSP_stride1,
   const float __vDSP_input2[],
   vDSP_Stride __vDSP_stride2,
   float __vDSP_result[],
   vDSP_Stride __vDSP_strideResult,
   vDSP_Length __vDSP_size
);
ベクトルとして、float型の配列を2つ渡して結果をfloat型の配列に返す
事がわかります。

関数の命名規則
iOS Developer Library vDSP Referenceをみると沢山の関数があります。
関数の数は多いのですが、命名規則があります。
どのような命名規則があるのでしょうか?
関数一覧を見てみましょう。

vDSP-D.png
この一覧を見るとまず、
vDSP_vadd
vDSP_vaddD
とDが付いているもの、付いていないもの
2つがある事が確認できます。

vDSP_vaddDについて、詳しく見てみましょう。
void vDSP_vaddD (
   const double __vDSP_input1[],
   vDSP_Stride __vDSP_stride1,
   const double __vDSP_input2[],
   vDSP_Stride __vDSP_stride2,
   double __vDSP_result[],
   vDSP_Stride __vDSP_strideResult,
   vDSP_Length __vDSP_size
);
ベクトルとして、doublet型の配列を2つ渡して結果をdoublet型の配列に返す
事がわかります。

関数名の最後にDがついているものはdoublet型を渡し、
何もついていないものはfloat型を渡すという命名ルールになっている事が確認できます。

この命名規則は、
vDSP Programming Guide Naming and Data Type Conventions
から確認する事ができます。

その他の命名規則は、
vDSPについてのメモ - 2:仙台単身赴任生活:So-net blog
が大変参考になります。

次回は、実際に他の関数も試してみます。


参考サイト
Forever For Now - Vectorizing with vDSP and vecLib