задача по умножению матрицы и вектора на vecLib-фреймворк Mac OS X 10.7 - PullRequest
4 голосов
/ 31 июля 2011

Я только начал использовать каркас vecLib для создания программы, выполняющей интенсивное умножение матрицы на вектор в Mac OS X 10.7.Я сделал простую программу, как это;умножьте матрицу a на вектор x и добавьте результат к вектору y.

#include <vecLib/vectorOps.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;
    vSgemv('n', 8, 4, 1.0f, (const vFloat *)a, (const vFloat *)x, 1.0f, (vFloat *)y);

    for (i = 0; i < 8; i++) {
        printf("%.4f\n", y[i]);
    }

    return 0;
}

Я скомпилировал и запустил программу на консоли

gcc -framework vecLib -o test test.c && ./test

Но результат был такой;операция не произошла, а вектор результата все еще был пуст.

1 Ответ

10 голосов
/ 31 июля 2011

Во-первых, фактическая ошибка очень проста, но вы бы не знали; вы передаете '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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...