Я впервые играю с фреймворком Accelerate с целью внедрить некоторый векторизованный код в приложение iOS. Я никогда не пытался делать что-либо в отношении работы с векторами в Objective C или C. Имея некоторый опыт работы с MATLAB, я задаюсь вопросом, действительно ли использование Accelerate настолько более болезненно. Предположим, я хочу рассчитать следующее:
b = 4*(sin(a/2))^2
где a и b — векторы.
Код МАТЛАБ:
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
Честно говоря, я не знаю, что здесь хуже: отслеживать все промежуточные шаги, пытаться запомнить, как передаются аргументы в vDSP применительно к VecLib (совсем другое), или то, что на выполнение чего-то совсем тривиального уходит столько времени.
Я очень надеюсь, что я что-то упустил и что большинство шагов можно объединить или сократить. Буду очень рад любым рекомендациям по ресурсам кодирования, хорошим привычкам кодирования (выученным трудным путем или из книги) и т. д.! Как вы все справляетесь с несколькими строками векторных вычислений?