0

ベクトル化されたコードを iOS アプリケーションに実装することを目標に、初めて Accelerate フレームワークをいじっています。Objective C または C でベクトルを操作することに関して、私は何もしようとはしませんでした。MATLAB の経験があるので、Accelerate を使用することは実際にそれほど苦痛なことなのだろうかと思います。次の計算をしたいとします。

b = 4*(sin(a/2))^2ここで、a と b はベクトルです。

MATLAB コード:

a = 1:4;
b = 4*(sin(a/2)).^2;

ただし、ドキュメンテーションをざっと見てみると、Accelerate を使用すると状況が大きく異なります。

私のC実装:

float a[4]  = {1,2,3,4};                        //define a
int len     = 4;
float div   = 2;                                //define 2
float a2[len];                                  //define intermediate result 1
vDSP_vsdiv(a, 1, &div, a2, 1, len);             //divide
float sinResult[len];                           //define intermediate result 2
vvsinf(sinResult, a2, &len);                    //take sine
float sqResult[len];                            //square the result
vDSP_vsq(sinResult, 1, sqResult, 1, len);       //take square
float factor = 4;                               //multiply all this by four
float b[len];                                   //define answer vector
vDSP_vsmul(sqResult, 1, &factor, b, 1, len);    //multiply

//unset all variables I didn't actually need

正直なところ、ここで何が最悪なのかわかりません。すべての中間ステップを追跡すること、VecLib に関して vDSP で引数がどのように渡されるかを記憶しようとすること (まったく異なります)、または非常に些細なことをするのに非常に時間がかかることです。

ここで何かが欠けていて、ほとんどのステップをマージまたは短縮できることを本当に願っています. コーディング リソース、良いコーディング習慣 (難しい方法や本から学んだもの) などに関する推奨事項は大歓迎です! 複数行のベクトル計算をどのように処理していますか?

4

2 に答える 2

1

そのように書くこともできると思いますが、私にはひどく複雑に思えます。私はこれがより好きです(インテル固有ですが、他のアーキテクチャーでは簡単に抽象化できます):

#include <Accelerate/Accelerate.h>
#include <immintrin.h>

const __m128 a = {1,2,3,4};
const __m128 sina2 = vsinf(a*_mm_set1_ps(0.5));
const __m128 b = _mm_set1_ps(4)*sina2*sina2;

また、衒学者であるために、ここで行っているのは線形代数ではありません。 線形代数は線形演算のみを含みます(二乗なし、のような超越演算はありませんsin)。


編集:あなたが指摘したように、上記はiOSではそのままではうまくいきません。最大の問題は、存在しないことですvsinf(vMathLibはiOSのAccelerateでは使用できません)。テスト用のSDKをマシンにインストールしていませんが、次のようなものが機能すると思います。

#include <Accelerate/Accelerate.h>

const vFloat a = {1, 2, 3, 4};
const vFloat a2 = a*(vFloat){0.5,0.5,0.5,0.5};
const int n = 4;
vFloat sina2;
vvsinf((float *)&sina2, (const float *)&a, &n);
const vFloat b = sina2*sina2*(vFloat){4,4,4,4};

vMathLibで可能なことほどきれいではありませんが、それでもかなりコンパクトです。

一般に、ベクトルに対する多くの基本的な算術演算は正しく機能します。ライブラリへの呼び出しを使用する必要はありません。そのため、Accelerateはこれらの操作をクリーンに提供するために邪魔になりません。代わりに、Accelerateは通常、他の手段ではすぐには利用できない操作を提供しようとします。

于 2012-04-22T04:38:16.263 に答える
0

私自身の質問に答えるには: iOS 6 では、vMathLib が導入されます。Stephen が明らかにしたように、vMathLib はすでに OSX で使用できましたが、iOS では使用できませんでした。今まで。

vMathLib が提供する関数により、ベクトル計算がより簡単になります。

于 2012-06-20T10:32:58.730 に答える