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