2011-07-31 13 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'을 전달해야합니다. 이 수정으로 코드가 작동합니다.

자, 이제 더 이상 미묘한 문제를 "잘못"하고 있다고 말했습니다.

먼저 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 
+0

우트을 내 0x200th 대답! –

+0

감사합니다. 정말 도움이되었습니다. 그러나 Accelerate framework [여기] (http://developer.apple.com/library/mac/#documentation/Accelerate/Reference/AccelerateFWRef/_index.html)의 참조 페이지에 잘못된 내용이 들어있는 이유를 알 수 없습니다. 정보가 잘못된 코드를 작성하게 만들었습니다. – araste

+0

+1 - 훌륭한 반응. – duffymo