Macos Mac OS X 10.7的vecLib框架中矩阵与向量相乘的问题

Macos Mac OS X 10.7的vecLib框架中矩阵与向量相乘的问题,macos,math,blas,accelerate-framework,Macos,Math,Blas,Accelerate Framework,我刚刚开始使用vecLib框架制作一个程序,在MacOSX10.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,

我刚刚开始使用vecLib框架制作一个程序,在MacOSX10.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;
}
但结果是这样的,;操作未发生,结果向量仍然为空

0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000

我是否错过了在vecLib框架中运行矩阵和向量函数的一些初始化?

首先,实际的错误非常简单,但您没有办法知道;您正在为第一个参数传递
'n'
,但实际上需要传递
'n'
(不管标题中写了什么)。有了这个补丁,你的代码就可以工作了

现在,也就是说,你正在做一些更微妙的事情“错”(ish)

首先,请不要使用vecLib。它被Accelerate.framework(在10.4中)所取代。vecLib.framework仅保留用于遗留支持。任何新的发展都应该与加速相联系

其次,请不要使用
vectorOps.h
中定义的v*函数。它们也被替换为
cblas.h
中定义的行业标准BLAS函数。因为它们是标准的,所以有很多关于如何使用它们的公共文档,而且它们还得到了更快的实现的支持;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;
}

谢谢,真的很有帮助。但是,我不明白为什么加速框架的参考页包含错误的信息,导致我编写了错误的代码。@araste:文档可能已经过时。在这种情况下,情况严重。我将提交错误信息的错误报告。
#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