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

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

この記事は、vDSP関数の使い方1の続きです。

前回は、ベクトルとベクトルの計算と命名規則について確認しました。
ベクトルとベクトルの計算について他にどのようなものがあるか確認してみる事にしましょう。

引き算
float inVector1[8] = {1, 2, 3, 4, 5, 6, 7, 8};
float inVector2[8] = {1, 2, 3, 4, 5, 6, 7, 8};
float outVectorSub[8];
vDSP_vsub(inVector1, 1, inVector2, 1, outVectorSub, 1, 8);
結果は次のようになります。
vdsp2-sub.png

掛け算
float inVector1[8] = {1, 2, 3, 4, 5, 6, 7, 8};
float inVector2[8] = {1, 2, 3, 4, 5, 6, 7, 8};
float outVectorMul[8];
vDSP_vmul(inVector1, 1, inVector2, 1, outVectorMul, 1, 8);
結果は次のようになります。
vdsp2-mul.png

割り算
float inVector1[8] = {1, 2, 3, 4, 5, 6, 7, 8};
float inVector2[8] = {1, 2, 3, 2, 5, 3, 3, 2};
float outVectorDiv[8];
vDSP_vdiv(inVector1, 1, inVector2, 1, outVectorDiv, 1, 8);
結果は次のようになります。
vdsp2-div.png

ここで、命名規則を見てみましょう。
vDSP_vadd  vectorの足し算
vDSP_vsub  vectorの引き算
vDSP_vmul  vectorの掛け算
vDSP_vdiv   vectorの割り算
のようになってる事が確認できます。

ベクトルとスカラーの計算
ベクトルの値を一律に変更したい場合、ベクトルとスカラーの計算を行います。
vDSP_vsadd について詳しく見てみましょう。

リファレンスには、
void vDSP_vsadd (
   float *__vDSP_A,
   vDSP_Stride __vDSP_I,
   float *__vDSP_B,
   float *__vDSP_C,
   vDSP_Stride __vDSP_K,
   vDSP_Length __vDSP_N
);
Parameters
__vDSP_A
Single-precision real input vector
__vDSP_I
Stride for A
__vDSP_B
Single-precision real input scalar
__vDSP_C
Single-precision real output vector
__vDSP_K
Stride for C
__vDSP_N
The number of elements to process
Adds scalar B to each element of vector A and stores the result in the corresponding element of vector C.
とあり、スカラーBをベクターAにそれぞれ足し結果をベクターCで返す事がわかります。
それでは実際にこの関数を使ってみましょう。

足し算
float inVector1[8] = {1, 2, 3, 4, 5, 6, 7, 8};
float outVectorVsadd[8];
float a = 10;
vDSP_vsadd(inVector1, 1, &a, outVectorVsadd, 1, 8);
結果は次のようになります。
vdsp2-vsadd.png

ベクトルの各値に、スカラー値が加算されている事が確認できます。

その他にも
足し算 / Vector-Scalar Addition
vDSP_vsadd
掛け算 / Vector-Scalar Multiplication
vDSP_vsmul
割り算 / Vector-Scalar Division
vDSP_vsdiv
などがあります。

命名規則
ベクトルとスカラーの計算では、vs(Vector-Scalar)が使われています。
ex) vDSP_vsadd

vDSP関数は数が多いのですが、命名規則を覚えてゆく事によって
関数の意味が名前から直感的に理解できるようになるでしょう。

次回に続きます。