用Mac OS X 10.7的vecLib框架将矩阵和向量相乘的问题

Posted

技术标签:

【中文标题】用Mac OS X 10.7的vecLib框架将矩阵和向量相乘的问题【英文标题】:problem on multiplying a matrix and a vector with vecLib framework of Mac OS X 10.7 【发布时间】:2011-07-31 02:45:31 【问题描述】:

我刚刚开始使用 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

但是结果是这样的;操作没有发生,结果向量还是空的。

0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000

我是否缺少一些初始化以在 vecLib 框架中运行矩阵和向量函数?

【问题讨论】:

【参考方案1】:

首先,实际的错误非常简单,但你无法知道;您为第一个参数传递了'n',但实际上您需要传递'N'(尽管标题中写了什么)。通过该修复,您的代码可以正常工作。

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

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

其次,请不要使用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;

运行它会给出:

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

【讨论】:

谢谢,真的很有帮助。但是,我无法弄清楚为什么 Accelerate 框架 here 的参考页面包含不正确的信息,导致我编写了错误的代码。 @araste:文档可能已过时。在这种情况下,严重的是。我会针对错误信息提交错误报告。

以上是关于用Mac OS X 10.7的vecLib框架将矩阵和向量相乘的问题的主要内容,如果未能解决你的问题,请参考以下文章

适用于 MAC OS X 10.7 的 VLCKit

Mac OS X 10.7 (Lion) 中的 Nano 语法高亮显示?

Xcode:Instruments 4.0 需要 Mac OS X 10.7 Lion?

在 10.6 上测试 Mac OS X 10.7 特定代码时出现“未找到符号”崩溃

Qt Designer 4.8 在 Mac OS X 10.7 上启动时崩溃

界面生成器:10.7 之前的 Mac OS X 版本上的属性不可用标识符