가 나는 코드를 다운로드 한 : 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-inta_times_b_cmplx.cpp(45)
: error C2143: syntax error : missing','
before'*'
a_times_b_cmplx.cpp(54)
: error C2065:'pntrb'
: undeclared identifiera_times_b_cmplx.cpp(55)
: error C2065:'pntrb'
: undeclared identifiera_times_b_cmplx.cpp(57)
: error C2065:'b'
: undeclared identifiera_times_b_cmplx.cpp(57)
: error C2065:'indx'
: undeclared identifiera_times_b_cmplx.cpp(58)
: error C2065:'c'
: undeclared identifiera_times_b_cmplx.cpp(156)
: error C4430: missing type specifier - int assumed. Note: C++ does not support default-inta_times_b_cmplx.cpp(156)
: error C2143: syntax error : missing','
before'*'
a_times_b_cmplx.cpp(159)
: error C2065:'c'
: undeclared identifiera_times_b_cmplx.cpp(169)
: error C2065:'pntrb'
: undeclared identifiera_times_b_cmplx.cpp(170)
: error C2065:'pntrb'
: undeclared identifiera_times_b_cmplx.cpp(172)
: error C2065:'indx'
: undeclared identifiera_times_b_cmplx.cpp(174)
: error C2065:'c'
: undeclared identifiera_times_b_cmplx.cpp(174)
: error C2065:'b'
: undeclared identifiera_times_b_cmplx.cpp(178)
: error C2065:'c'
: undeclared identifiera_times_b_cmplx.cpp(178)
: error C2065:'b'
: undeclared identifiera_times_b_cmplx.cpp(180)
: error C2065:'c'
: undeclared identifiera_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
일 수 있다고 생각합니다. 하지만 어떻게 해결할 수 있을까요?
무례하게 들릴 의미는 없지만이 질문의 모양을 미리 보았을 때 제출 버튼을 누르기 전에 모든 코드가 올바르게 포맷 된 것처럼 보입니까? Crikey. – razlebe
죄송합니다. 몇 시간 동안이 문제를 다루고 있으며, 단지 나를 미치게 만듭니다. 조금만 서둘러야 겠다는 생각이 들었습니다. – Ada
당신의 질문을 매우 (그리고 ** long **) 괴롭히는 것은 당신에게 답을 빨리 줄지 못할 것입니다. -/ – ildjarn