首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Accelerate框架对向量进行编码

使用Accelerate框架对向量进行编码
EN

Stack Overflow用户
提问于 2012-04-21 00:03:30
回答 2查看 1.5K关注 0票数 0

我第一次尝试使用Accelerate框架,目的是将一些矢量化的代码实现到iOS应用程序中。我从来没有尝试过在Objective C或C中使用向量,有一些MATLAB的经验,我想知道使用Accelerate是否真的那么痛苦。假设我想要计算以下内容:

b = 4*(sin(a/2))^2,其中a和b是向量。

MATLAB代码:

代码语言:javascript
复制
a = 1:4;
b = 4*(sin(a/2)).^2;

然而,正如我在文档中看到的那样,使用Accelerate会有很大的不同。

我的C实现:

代码语言:javascript
复制
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中传递的(非常不同),或者做一些相当琐碎的事情需要这么多时间。

我真的希望我在这里遗漏了一些东西,大多数步骤都可以合并或缩短。任何关于编码资源、良好的编码习惯(通过艰苦的方式或从书中学到的)等方面的建议都将非常受欢迎!你们是如何处理多行向量计算的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-22 12:38:16

我想你可以这样写,但对我来说似乎太复杂了。我更喜欢这个(特定于英特尔,但可以很容易地抽象为其他架构):

代码语言:javascript
复制
#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进行测试,但我相信下面这样的东西应该可以工作:

代码语言:javascript
复制
#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通常会尝试提供其他方式无法立即使用的操作。

票数 1
EN

Stack Overflow用户

发布于 2012-06-20 18:32:59

回答我自己的问题:在iOS 6中,将引入vMathLib。正如斯蒂芬澄清的那样,vMathLib已经可以在OSX上使用了,但它在iOS中不可用。直到现在。

vMathLib提供的函数将允许更简单的向量计算。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10249597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档