Во-первых, фактическая ошибка очень проста, но вы бы не знали; вы передаете 'n'
для первого аргумента, но вам действительно нужно передать 'N'
(несмотря на то, что написано в заголовке). С этим исправлением ваш код работает.
Теперь, как говорится, вы делаете пару более тонких вещей "неправильно" (иш).
Во-первых, пожалуйста, не используйте vecLib. Он был заменен на Accelerate.framework (в 10.4!). vecLib.framework хранится только для поддержки предыдущих версий. Любая новая разработка должна ссылаться на Accelerate.
Во-вторых, пожалуйста, не используйте функции v *, определенные в vectorOps.h
. Они также были заменены стандартными функциями BLAS, определенными в cblas.h
. Поскольку они являются стандартными, существует множество открытых документов о том, как их использовать, и они также подкреплены гораздо более быстрыми реализациями; Функции vectorOps поддерживаются только для устаревшей поддержки. cblas.h
также поддерживает множество других операций и типов данных. Если этого всего недостаточно, если вы решите перенести свой код на iOS, вы обнаружите, что функции vectorOps вообще не доступны. Используйте функции cblas.h
.
Переписав пример, как предложено:
#include <Accelerate/Accelerate.h>
#include <stdio.h>
float a[8][4] = // the matrix to be multiplied
{
{1.0f, 0.0f, 0.0f, 0.0f},
{0.0f, 1.0f, 0.0f, 0.0f},
{1.0f, 1.0f, 0.0f, 0.0f},
{0.0f, 0.0f, 1.0f, 1.0f},
{1.0f, 0.0f, 1.0f, 0.0f},
{1.0f, 0.0f, 1.0f, 0.0f},
{1.0f, 1.0f, 1.0f, 0.0f},
{0.0f, 0.0f, 0.0f, 1.0f},
};
float x[4] = {1.0f, 2.0f, 4.0f, 8.0f}; // the vector to be multiplied
float y[8] = {0.f, 0.f, 0.f, 0.f, // the result vector
0.f, 0.f, 0.f, 0.f};
int main() {
int i;
cblas_sgemv(CblasRowMajor, CblasNoTrans, 8, 4, 1.0f, (float*)a, 4, x, 1, 1.0f, y, 1);
for (i = 0; i < 8; i++) {
printf("%.4f\n", y[i]);
}
return 0;
}
и его запуск дает:
scanon$ gcc test.c -framework Accelerate -o test
scanon$ ./test
1.0000
2.0000
3.0000
12.0000
5.0000
5.0000
7.0000
8.0000