3

Accelerate.frameworkベクトルをスカラーでスケーリングし、ベクトルを正規化するには、どの関数を使用できますか? ドキュメントでスケーリングに役立つと思われるものを見つけましたが、その操作について混乱しています。

vDSP_vsma
Vector scalar multiply and vector add; single precision.

void vDSP_vsma (
   const float *__vDSP_A,
   vDSP_Stride __vDSP_I,
   const float *__vDSP_B,
   const float *__vDSP_C,
   vDSP_Stride __vDSP_K,
   float *__vDSP_D,
   vDSP_Stride __vDSP_L,
   vDSP_Length __vDSP_N
);
4

1 に答える 1

9

ベクターをその場で正規化する最も簡単な方法は、次のようなものです

int n = 3;
float v[3] = {1, 2, 3};
cblas_sscal(n, 1.0 / cblas_snrm2(n, v, 1), v, 1);

あなたがする必要があります

#include <cblas.h>

また

#include <vblas.h>

(または両方)。ベクトルを操作する場合、いくつかの関数は「行列」セクションにあることに注意してください。

vDSP 関数を使用する場合は、ベクトル - スカラー除算のセクションを参照してください。できることはいくつかあります。

  • vDSP_dotpr()sqrt()、およびvDSP_vsdiv()
  • vDSP_dotpr()vrsqrte_f32()、およびvDSP_vsmul()(vrsqrte_f32()ただし、NEON GCC 組み込みであるため、armv7 用にコンパイルしていることを確認する必要があります)。
  • vDSP_rmsqv()、乗算sqrt(n)、およびvDSP_vsdiv()

ベクトル正規化関数がない理由は、vDSP の「ベクトル」が「一度に多くのもの」( 4096/あたりまで8192) を意味し、必然的に線形代数の「ベクトル」であるためです。要素ベクトルを正規化することはまったく無意味1024であり、要素ベクトルを正規化するための簡単な関数は3、アプリを大幅に高速化するものではありません。

vDSP の使用目的は、要素ベクトルの正規化に似てい1024 2ます3。これを行う方法はいくつかあります。

  • vDSP_vdist()長さのベクトルを取得するために使用し、その後にvDSP_vdiv(). vDSP_vdist()ただし、長さが 2 を超えるベクトルには複数回使用する必要があります。
  • vDSP_vsq()すべての入力を 2 乗するために使用し、必要に応じて、または、およびまたはとvDSP_vadd()同等で、それらすべてを追加するために複数回使用します。orに相当するものを書くのはそれほど難しいことではありません。vDSP_vsqrt()vDSP_vrsqrt()vDSP_vmul()vDSP_vdiv()vDSP_vsqrt()vDSP_vrsqrt()
  • 入力が複雑なベクトルであると偽るさまざまな方法。速くなる可能性はありません。

もちろん、正規化する 1024 個のベクトルがない場合でも、複雑にしすぎないでください。

ノート:

  1. 相対性理論の「4 ベクトル」との混同を避けるため、「2 ベクトル」と「3 ベクトル」は使用しません。
  2. nの適切な選択は、L1 データ キャッシュをほぼいっぱいにするものです。難しいことではありません。32Kそれらは約10年以上にわたって比較的固定されています(ハイパースレッドCPUの仮想コア間で共有されている可能性があり、古い/安価なプロセッサーには16Kがある場合があり8192ます)。浮きます。スタック スペースを少し減らしたいと思うかもしれません。また、複数の連続した操作を実行している場合は、おそらくすべてをキャッシュに保持したいと思うでしょう。1024または2048かなり賢明に見え、それ以上はおそらくリターンが減少するでしょう。気にするなら、パフォーマンスを測定してください...
于 2010-11-23T02:35:26.027 に答える