2012-04-20 15 views
0

iOSアプリケーションにベクトル化されたコードを実装する目的で、Accelerateフレームワークを初めて使用しています。私はObjective CやCのベクタを使って作業することに関して決して何もしようとはしませんでした.Maclabの経験があるので、Accelerateを使用するのが本当に苦痛であるのだろうかと思います。次のように計算したいとします。Accelerateフレームワークを使用したベクトルによる符号化

ここで、aとbはベクトルです。

MATLABコード:

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

私はドキュメントを通していくつかの唾の後にそれを見るようにしかし、物事は加速使ってかなり異なっています。

私の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に渡される方法を暗記しようとすると、すべての中間ステップを追跡します)、それは非常に些細なことをするのにとても時間がかかります。

私は本当にここに何かが足りないと思っています。そして、ほとんどの手順を統合したり短縮したりできます。コーディングリソース、良いコーディング習慣(難しいやり方を学んだり、本から習得したことなど)に関する推奨事項は大歓迎です!どのようにベクトル計算の複数の行を扱っていますか?

+0

単純な除算を実行するために、このライブラリにポインタで渡された変数に2が必要な場合は、ライブラリがうまくいっていると思います。あるいは、あなたが使っていないベクトル以外の部分があるかもしれません。 – Shahbaz

答えて

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; 

また、単に知識をひけらかすように、何をここでやっていることは代数直線的ではありません。 Linear代数は線形演算のみを含みます(二乗はありません。sinのような超越演算はありません)。


編集:上記のように、iOSではほとんど問題なく動作します。最大の問題は、vsinfがないことです(vMathLibはiOSのAccelerateでは利用できません)。私がテストするために私のマシンにインストールされているSDKを持っていないが、私は次のようなものが動作するはずと信じている:まだかなりコンパクトvMathLibで可能であるが、何ほどきれい

#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}; 

ありません。

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

+0

ありがとう@Stephen。これは線形操作ではないということはまったく正しいです。また、私はこれがiOSアプリケーション用であることを指摘しなければならないことに気づきました(したがって、Intelチップはありません)ので、これを反映するように私の質問を更新しました。 Appleは、Accelerateフレームワークを使用することがベクター操作の最善の方法だと考えているので、私の実装が本当にうまくいくかどうか疑問に思っていました。 – Tom

0

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

vMathLibが提供する関数は、ベクトル計算を容易にします。

関連する問題