0
votes

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. 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. 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.

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. But how can I solve this?

1
Not meaning to sound rude, but when you previewed the appearance of this question, did it honestly look like all of that code had been formatted properly before you hit the submit button? Crikey.razlebe
Sorry, I am dealing with this for hours and it just drives me crazy I only wanted to hurry up a little bit.Ada
Making your question downright painful to read (and long) isn't going to get you answers faster... ;-/ildjarn
@ildjarn: Guess this time I got lucky and solved it on my own...Ada

1 Answers

1
votes

I think that your compiler is unable to find the mwIndex type (as you suspect).

A quick Google search through some matlab documentation reveals that mwIndex is declared in the matrix.h header file.

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.