简体   繁体   English

为什么这个 CPP 文件在 mex -largeArrayDims 期间会出错?

[英]Why does this CPP file give error during mex -largeArrayDims?

I have downloaded a code:我已经下载了一个代码:

/*================================================================
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;
  }
}

I used mex -largeArrayDims thisfile.cpp with selecting Visual C++ 2010 compiler .我使用mex -largeArrayDims thisfile.cpp并选择Visual C++ 2010 compiler However, It gives me these errors:但是,它给了我这些错误:

mex -largeArrayDims a_times_b_cmplx.cpp

a_times_b_cmplx.cpp(45) : error C4430: missing type specifier - int assumed. a_times_b_cmplx.cpp(45) :错误 C4430:缺少类型说明符 - 假定为 int。 Note: C++ does not support default-int注意:C++ 不支持 default-int
a_times_b_cmplx.cpp(45) : error C2143: syntax error: missing ',' before '*' a_times_b_cmplx.cpp(45) :错误 C2143:语法错误:在'*'之前缺少',' '
a_times_b_cmplx.cpp(54) : error C2065: 'pntrb' : undeclared identifier a_times_b_cmplx.cpp(54) :错误 C2065: 'pntrb' :未声明的标识符
a_times_b_cmplx.cpp(55) : error C2065: 'pntrb' : undeclared identifier a_times_b_cmplx.cpp(55) :错误 C2065: 'pntrb' :未声明的标识符
a_times_b_cmplx.cpp(57) : error C2065: 'b' : undeclared identifier a_times_b_cmplx.cpp(57) :错误 C2065: 'b' :未声明的标识符
a_times_b_cmplx.cpp(57) : error C2065: 'indx' : undeclared identifier a_times_b_cmplx.cpp(57) :错误 C2065: 'indx' :未声明的标识符
a_times_b_cmplx.cpp(58) : error C2065: 'c' : undeclared identifier a_times_b_cmplx.cpp(58) :错误 C2065: 'c' :未声明的标识符
a_times_b_cmplx.cpp(156) : error C4430: missing type specifier - int assumed. a_times_b_cmplx.cpp(156) :错误 C4430:缺少类型说明符 - 假定为 int。 Note: C++ does not support default-int注意:C++ 不支持 default-int
a_times_b_cmplx.cpp(156) : error C2143: syntax error: missing ',' before '*' a_times_b_cmplx.cpp(156) :错误 C2143:语法错误:在'*'之前缺少',' '
a_times_b_cmplx.cpp(159) : error C2065: 'c' : undeclared identifier a_times_b_cmplx.cpp(159) :错误 C2065: 'c' :未声明的标识符
a_times_b_cmplx.cpp(169) : error C2065: 'pntrb' : undeclared identifier a_times_b_cmplx.cpp(169) :错误 C2065: 'pntrb' :未声明的标识符
a_times_b_cmplx.cpp(170) : error C2065: 'pntrb' : undeclared identifier a_times_b_cmplx.cpp(170) :错误 C2065: 'pntrb' :未声明的标识符
a_times_b_cmplx.cpp(172) : error C2065: 'indx' : undeclared identifier a_times_b_cmplx.cpp(172) :错误 C2065: 'indx' :未声明的标识符
a_times_b_cmplx.cpp(174) : error C2065: 'c' : undeclared identifier a_times_b_cmplx.cpp(174) :错误 C2065: 'c' :未声明的标识符
a_times_b_cmplx.cpp(174) : error C2065: 'b' : undeclared identifier a_times_b_cmplx.cpp(174) :错误 C2065: 'b' :未声明的标识符
a_times_b_cmplx.cpp(178) : error C2065: 'c' : undeclared identifier a_times_b_cmplx.cpp(178) :错误 C2065: 'c' :未声明的标识符
a_times_b_cmplx.cpp(178) : error C2065: 'b' : undeclared identifier a_times_b_cmplx.cpp(178) :错误 C2065: 'b' :未声明的标识符
a_times_b_cmplx.cpp(180) : error C2065: 'c' : undeclared identifier a_times_b_cmplx.cpp(180) :错误 C2065: 'c' :未声明的标识符
a_times_b_cmplx.cpp(180) : error C2065: 'b' : undeclared identifier a_times_b_cmplx.cpp(180) :错误 C2065: 'b' :未声明的标识符

C:\PROGRA~1\MATLAB\R2010A\BIN\MEX.PL : Error: Compile of 'a_times_b_cmplx.cpp' failed. C:\PROGRA~1\MATLAB\R2010A\BIN\MEX.PL :错误: 'a_times_b_cmplx.cpp'编译失败。

I don't know why I am getting these errors.我不知道为什么我会收到这些错误。 This is a finished, licenced code and I should be able to mex it.这是一个已完成的许可代码,我应该能够将其混合。 Can you tell me the reason and show me a way to fix this.你能告诉我原因并告诉我解决这个问题的方法吗? I really don't know if the compiler is a problem or me.我真的不知道是编译器的问题还是我的问题。

I think it may be because of the mwIndex .我认为这可能是因为mwIndex But how can I solve this?但是我该如何解决呢?

I think that your compiler is unable to find the mwIndex type (as you suspect).我认为您的编译器无法找到mwIndex类型(正如您所怀疑的那样)。

A quick Google search through some matlab documentation reveals that mwIndex is declared in the matrix.h header file.通过一些matlab 文档快速谷歌搜索显示mwIndexmatrix.h header 文件中声明。

So try adding所以尝试添加

#include <matrix.h>

...to your code. ...到您的代码。 I suspect most of those error messages will go, though who knows if there are any other issues hiding behind it.我怀疑这些错误消息中的大多数将是 go,尽管谁知道它背后是否隐藏着任何其他问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM