2011-05-02 2 views
0

가 나는 코드를 다운로드 한 : mex-largeArrayDims 중에 왜이 CPP 파일에 오류가 있습니까?

/*================================================================ 
a_times_b_cmplx.c = used by a couple of mex functions 
provide Matrix vector multiplications, 
and solve triangular systems 
(sparse matrix and full vector) 

CSC_CmplxVecMult_CAB_double, CSR_CmplxVecMult_CAB_double, 
CSCsymm_CmplxVecMult_CAB_double added by Mirko Visontai (10/24/2003) 

*=================================================================*/ 
# include "math.h" 

///*c<-a'*b */ 
//void scalar_product(
// const int m, const int k, /*nb_rows, nb_columns*/ 
// const double *a, 
// const double *b, 
// double *c) 
//{ 
// int i; 
// double d; 
// d = 0; 
// for (i=0;i!=m;i++) 
// d+=a[i]*b[i]; 
// c[0] = d; 
//} 

/*C<-a*A*B+C*/ 
void CSC_VecMult_CaABC_double(const int m, const int k, const double alpha, const double *val, const int *indx, const int *pntrb,const double *b, double *c) 
{ 
    int i,j,jb,je; 

    for (i=0;i!=k;i++){ 
    jb = pntrb[i]; 
    je = pntrb[i+1]; 
    for (j=jb;j!=je;j++) 
     c[indx[j]] += alpha * b[i] * val[j]; 
    } 
} 

/*C<-a*A'*B+C*/ 
void CSR_VecMult_CaABC_double(const int k, const int m, const double alpha,const double *val, const mwIndex *indx, const mwIndex *pntrb,const double *b, double *c) 
{ 
    double t; 
    const double *pval; 
    int i,j,jb,je; 

    pval = val; 
    for (i=0;i!=m;i++) { 
    t = 0; 
    jb = pntrb[i]; 
    je = pntrb[i+1]; 
    for (j=jb;j!=je;j++) 
     t += alpha * b[indx[j]] * (*pval++); 
    c[i] += t; 
    } 
} 

/*C<-A*b */ 
void CSC_VecMult_CAB_double(const int m, const int k, /*nb_rows, nb_columns*/ const double *val, const int *indx, const int *pntrb, const double *b, double *c) 
{ 
    int i,j,jb,je; 
    double *pc=c; 
    for (i=0;i!=m;i++) 
    *pc++ = 0; 

    for (i=0;i!=k;i++){ 
    jb = pntrb[i]; 
    je = pntrb[i+1]; 
    for (j=jb;j!=je;j++) 
     c[indx[j]] += b[i] * val[j]; 
    } 
} 

/*C<-A*b (complex)*/ 
void CSC_CmplxVecMult_CAB_double(const int m, const int k, const double *valr, const double *vali,const int *indx, const int *pntrb,const double *br, const double *bi,double *cr, double *ci) 
{ 
    int i,j,jb,je; 
    double *pcr=cr; 
    double *pci=ci; 
    for (i=0;i!=m;i++){ 
    *pcr++ = 0.0; 
    *pci++ = 0.0; 
    } 

    for (i=0;i!=k;i++){ 
    jb = pntrb[i]; 
    je = pntrb[i+1]; 
    for (j=jb;j!=je;j++){ 
     cr[indx[j]] += (br[i] * valr[j]) - (bi[i] * vali[j]); 
     ci[indx[j]] += (br[i] * vali[j]) + (bi[i] * valr[j]); 
    } 
    } 
} 

/*C<-A'*b 
plus rapide que CSC_VecMult_CAB_double */ 
void CSR_VecMult_CAB_double(const int k, const int m, const double *val, const int *indx, const int *pntrb, const double *b, double *c) 
{ 
    double t; 
    const double *pval; 
    double *pc=c; 
    int i,j,jb,je; 

    for (i=0;i!=m;i++) 
    *pc++ = 0; 

    pval = val; 
    for (i=0;i!=m;i++) { 
    t = 0; 
    jb = pntrb[i]; 
    je = pntrb[i+1]; 
    for (j=jb;j!=je;j++) 
     t += b[indx[j]] * (*pval++); 
    c[i] += t; 
    } 
} 

/*C<-A'*b (complex) 
plus rapide que CSC_VecMult_CAB_double */ 
void CSR_CmplxVecMult_CAB_double(const int k, const int m, const double *valr, const double *vali, const int *indx, const int *pntrb, const double *br, const double *bi, double *cr, double *ci) 
{ 
    double tr, ti; 
    const double *pvalr; 
    const double *pvali; 
    double *pcr=cr; 
    double *pci=ci; 
    int i,j,jb,je; 

    for (i=0;i!=m;i++){ 
    *pcr++ = 0.0; 
    *pci++ = 0.0; 
    } 

    pvalr = valr; 
    pvali = vali; 
    for (i=0;i!=m;i++) { 
    tr = 0.0; 
    ti = 0.0; 
    jb = pntrb[i]; 
    je = pntrb[i+1]; 
    for (j=jb;j!=je;j++){ 
     tr += (br[indx[j]] * (*pvalr)) - (bi[indx[j]] * (*pvali)); 
     ti += (br[indx[j]] * (*pvali++)) + (bi[indx[j]] * (*pvalr++)); 
    } 
    cr[i] += tr; 
    ci[i] += ti; 
    } 
} 

/* C<-A*b (A is symmetric) */ 
void CSRsymm_VecMult_CAB_double(const int k, const int m, const double *val, const mwIndex *indx, const mwIndex *pntrb, const double *b, double *c) 
{ 
    const double *pval; 
    double *pc=c; 
    int i,j; 
    int jj; 
    int rpntrb, rpntre; 
    int index, nvals; 

    for (i=0;i!=m;i++) 
    *pc++ = 0; 
    pval = val; 
    for (j=0;j!=k;j++){ 
    rpntrb = pntrb[j]; 
    rpntre = pntrb[j+1]; 
    for (jj=rpntrb;jj!=rpntre;jj++) { 
     index = indx[jj]; 
     if (index == j) { 
     c[j] += b[j] * (*pval++); 
     continue; 
     } 
     if (index > j) { 
     c[index] += b[j] * (*pval); 
     c[j] += b[index] * (*pval++); 
     } 
     else { 
     pval++; 
     } 
    } 
    } 
} 

/* C<-A*b (A is symmetric and complex) */ 
void CSRsymm_CmplxVecMult_CAB_double(const int k, const int m, const double *valr, const double *vali, const int *indx, const int *pntrb, const double *br, const double *bi, double *cr, double *ci) 
{ 
    const double *pvalr, *pvali; 
    double *pcr=cr; 
    double *pci=ci; 
    int i,j; 
    int jj; 
    int rpntrb, rpntre; 
    int index, nvals; 

    for (i=0;i!=m;i++){ 
    *pcr++ = 0.0; 
    *pci++ = 0.0; 
    } 

    pvalr = valr; 
    pvali = vali; 
    for (j=0;j!=k;j++){ 
    rpntrb = pntrb[j]; 
    rpntre = pntrb[j+1]; 
    for (jj=rpntrb;jj!=rpntre;jj++) { 
     index = indx[jj]; 
     if (index == j) { 
     cr[j] += (br[j] * (*pvalr)) - (bi[j] * (*pvali)); 
     ci[j] += (br[j] * (*pvali++)) + (bi[j] * (*pvalr++)); 
     continue; 
     } 
     if (index > j) { 
     cr[index] += (br[j] * (*pvalr)) - (bi[j] * (*pvali)); 
     ci[index] += (br[j] * (*pvali)) + (bi[j] * (*pvalr)); 

     cr[j] += (br[index] * (*pvalr)) - (bi[index] * (*pvali)); 
     ci[j] += (br[index] * (*pvali++)) + (bi[index] * (*pvalr++)); 
     } 
     else { 
     pvalr++; 
     pvali++; 
     } 
    } 
    } 
} 

/*C<-A\B; with Lower triangular A*/ 
void CSC_VecTriangSlvLD_CAB_double(const int m, const double *val, const int *indx, const int *pntrb, const double *b, double *c) 
{ 
    int i, j, jb, je; 
    double *pc=c; 
    double z; 

    for (i=0;i!=m;i++){ 
    *pc = b[i]; 
    pc++; 
    } 

    pc=c; 
    for (i=0;i!=m;i++) { 
    jb = pntrb[i]; 
    je = pntrb[i+1]; 
    z = pc[i]/val[jb]; 
    pc[i] = z; 
    for (j=jb+1;j<je;j++) { 
     c[indx[j]] -= z*val[j]; 
    } 
    } 
} 

/*C<-A\B; with Upper triangular A*/ 
void CSC_VecTriangSlvUD_CAB_double(const int m, const double *val, const int *indx, const int *pntrb, const double *b, double *c) 
{ 
    int i, j, jb, je, index; 
    double *pc=c; 
    double z; 

    for (i=0;i!=m;i++){ 
    *pc = b[i]; 
    pc++; 
    } 

    pc=c; 
    for (i=m-1;i!=-1;i--) { 
    jb = pntrb[i]; 
    je = pntrb[i+1]-1; 
    z = pc[i] /val[je]; 
    pc[i] = z; 
    for (j=jb;j<je;j++) { 
     c[indx[j]] -= z * val[j]; 
    } 
    } 
} 

/*C<-A'\B; where A is upper (little slower than CSC)*/ 
void CSR_VecTriangSlvLD_CAB_double(const int m, const double *val, const int *indx, const int *pntrb, const double *b, double *c) 
{ 
    int i, j, jb, je, index; 
    double *pc=c; 
    double z; 
    double valtmp; 

    pc=c; 
    for (i=0;i!=m;i++) { 
    z = 0; 
    jb = pntrb[i]; 
    je = pntrb[i+1]; 
    for (j=jb;j<je;j++) { 
     index = indx[j]; 
     if (index == i) { 
     valtmp = val[j]; 
     } else { 
     z += c[index] * val[j]; 
     } 
    } 
    pc[i] = (b[i] - z)/valtmp; 
    } 
} 

/*C<-A'\B; where A is lower (little slower than CSC)*/ 
void CSR_VecTriangSlvUD_CAB_double(const int m, const double *val, const int *indx, const int *pntrb, const double *b, double *c) 
{ 
    int i, j, jb, je, index; 
    double *pc=c; 
    double valtmp; 
    double z; 

    pc=c; 
    for (i=m-1;i!=-1; i--) { 
    z = 0; 
    jb = pntrb[i]; 
    je = pntrb[i+1]; 
    for (j=jb+1; j<je; j++) { 
     z += c[indx[j]] * val[j]; 
    } 
    pc[i] = (b[i] - z)/val[jb]; 
    } 
} 

/*C<-A*B, where A is (m,k) and B is (k,n)*/ 
void CSC_MatMult_CAB_double(const int m, const int n, const int k, const double *val, const int *indx, const int *pntrb, const double *b, const int ldb, double *c, const int ldc) 
{ 
    int i,j,jb,je; 
    double *pc=c; 
    int l; 

    for (l=0;l!=n;l++) 
    for (i=0;i!=m;i++) 
     *pc++ = 0; 

    for (l=0;l!=n;l++) { 
    for (i=0;i!=k;i++){ 
     jb = pntrb[i]; 
     je = pntrb[i+1]; 
     for (j=jb;j!=je;j++) 
     c[indx[j]] += b[i] * val[j]; 
    } 
    /*c += ldc; b += ldb; */ 
    c += m; b += m; 
    } 
} 

내가 비주얼 C++ 2010 컴파일러을 선택하여 mex -largeArrayDims thisfile.cpp을 사용했다. 그러나이 오류는 다음과 같습니다.

mex -largeArrayDims a_times_b_cmplx.cpp

a_times_b_cmplx.cpp(45) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
a_times_b_cmplx.cpp(45) : error C2143: syntax error : missing ',' before '*'
a_times_b_cmplx.cpp(54) : error C2065: 'pntrb' : undeclared identifier
a_times_b_cmplx.cpp(55) : error C2065: 'pntrb' : undeclared identifier
a_times_b_cmplx.cpp(57) : error C2065: 'b' : undeclared identifier
a_times_b_cmplx.cpp(57) : error C2065: 'indx' : undeclared identifier
a_times_b_cmplx.cpp(58) : error C2065: 'c' : undeclared identifier
a_times_b_cmplx.cpp(156) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
a_times_b_cmplx.cpp(156) : error C2143: syntax error : missing ',' before '*'
a_times_b_cmplx.cpp(159) : error C2065: 'c' : undeclared identifier
a_times_b_cmplx.cpp(169) : error C2065: 'pntrb' : undeclared identifier
a_times_b_cmplx.cpp(170) : error C2065: 'pntrb' : undeclared identifier
a_times_b_cmplx.cpp(172) : error C2065: 'indx' : undeclared identifier
a_times_b_cmplx.cpp(174) : error C2065: 'c' : undeclared identifier
a_times_b_cmplx.cpp(174) : error C2065: 'b' : undeclared identifier
a_times_b_cmplx.cpp(178) : error C2065: 'c' : undeclared identifier
a_times_b_cmplx.cpp(178) : error C2065: 'b' : undeclared identifier
a_times_b_cmplx.cpp(180) : error C2065: 'c' : undeclared identifier
a_times_b_cmplx.cpp(180) : error C2065: 'b' : undeclared identifier

C:\PROGRA~1\MATLAB\R2010A\BIN\MEX.PL : Error: Compile of 'a_times_b_cmplx.cpp' failed.

왜 이러한 오류가 발생하는지 알 수 없습니다. 이것은 완성 된 라이센스 코드이며 mex로 할 수 있어야합니다. 이유를 말해 주시고이를 해결할 수있는 방법을 보여 주실 수 있습니까? 나는 정말로 컴파일러가 문제인지 저인지 모른다.

나는 mwIndex 일 수 있다고 생각합니다. 하지만 어떻게 해결할 수 있을까요?

+0

무례하게 들릴 의미는 없지만이 질문의 모양을 미리 보았을 때 제출 버튼을 누르기 전에 모든 코드가 올바르게 포맷 된 것처럼 보입니까? Crikey. – razlebe

+0

죄송합니다. 몇 시간 동안이 문제를 다루고 있으며, 단지 나를 미치게 만듭니다. 조금만 서둘러야 겠다는 생각이 들었습니다. – Ada

+0

당신의 질문을 매우 (그리고 ** long **) 괴롭히는 것은 당신에게 답을 빨리 줄지 못할 것입니다. -/ – ildjarn

답변

1

당신의 컴파일러가 mwIndex 타입을 찾을 수 없다고 생각합니다.

을 통해 빠른 Google 검색은 matrix.h 헤더 파일에 mwIndex이 선언되어 있음을 나타냅니다.

그래서 코드에 ...

#include <matrix.h> 

추가하려고합니다. 나는 그 오류 메시지의 대부분이 갈 것이라고 의심하지만 그 뒤에 숨어있는 다른 문제가 있는지 누가 알겠는가.

+0

int로 변경했습니다. – Ada

관련 문제