2011-07-31 14 views
4

私はvecLibフレームワークを使って、Mac OS X 10.7で集中的な行列 - ベクトル乗算を行うプログラムを作成し始めました。私はこのような簡単なプログラムを作った。行列aにベクトルxを掛け、その結果をベクトルyに加算する。Mac OS X 10.7のvecLibフレームワークで行列とベクトルを掛ける問題

#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フレームワークで行列とベクトル関数を実行するための初期化がありませんか?

答えて

10

まず、実際のバグは非常にシンプルですが、知る方法はありませんでした。最初の引数には'n'を渡していますが、実際には'N'(ヘッダに書かれている内容にもかかわらず)を渡す必要があります。その修正により、コードが機能します。

今や、あなたは「間違っている」という2つの微妙なことをしています。

まず、vecLibは使用しないでください。それはAccelerate.framework(10.4!)に置き換えられました。 vecLib.frameworkは従来のサポートのためにのみ保持されています。新しい開発は、代わりにAccelerateにリンクする必要があります。

第2に、vectorOps.hで定義されているv *関数を使用しないでください。それらも置換されており、業界標準の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 
+0

Woot、私の0x200thの答えを! –

+0

ありがとう、本当に役に立ちました。しかし、Accelerate framework [here](http://developer.apple.com/library/mac/#documentation/Accelerate/Reference/AccelerateFWRef/_index.html)のリファレンスページに不正確な情報が含まれている理由を理解できません私に間違ったコードを書くようになった情報 – araste

+0

+1 - 素晴らしい応答。 – duffymo

関連する問題