gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:50:30 28 4
gpt4 key购买 nike

我刚刚开始使用 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 框架中运行矩阵和向量函数?

最佳答案

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

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

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

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

关于macos - 用Mac OS X 10.7的vecLib框架将矩阵和向量相乘的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6887229/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com