你如何修复错误编译matlab? [英] how do you fix error compile matlab ?

查看:126
本文介绍了你如何修复错误编译matlab?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

hi
我正在使用matlab 2013a 64bit和win7 x64。

尝试编译mex文件(resize.cc)。





hi i'm using matlab 2013a 64bit and win7 x64.
try compile mex file (resize.cc).


>> mex -setup

Welcome to mex -setup.  This utility will help you set up
a default compiler.  For a list of supported compilers, see
http://www.mathworks.com/support/compilers/R2013a/win64.html

Please choose your compiler for building MEX-files:

Would you like mex to locate installed compilers [y]/n? y

Select a compiler:
[1] Intel Visual Fortran 13 (with Microsoft Software Development Kit (SDK) linker) in C:\Program Files (x86)\Intel\Composer XE 2013\
[2] Intel Visual Fortran 13.0 (with Microsoft Visual C++ 2012 linker) in C:\Program Files (x86)\Intel\Composer XE 2013
[3] Microsoft Software Development Kit (SDK) 7.1 in C:\Program Files (x86)\Microsoft Visual Studio 10.0
[4] Microsoft Visual C++ 2012 in D:\Program Files (x86)\Microsoft Visual Studio 11.0

[0] None

Compiler: 4

Please verify your choices:

Compiler: Microsoft Visual C++ 2012
Location: D:\Program Files (x86)\Microsoft Visual Studio 11.0

Are these correct [y]/n? y

***************************************************************************
  Warning: MEX-files generated using Microsoft Visual C++ 2012 require
           that Microsoft Visual Studio 2012 run-time libraries be
           available on the computer they are run on.
           If you plan to redistribute your MEX-files to other MATLAB
           users, be sure that they have the run-time libraries.
***************************************************************************


Trying to update options file: C:\Users\AsUs\AppData\Roaming\MathWorks\MATLAB\R2013a\mexopts.bat
From template:              D:\PROGRA~2\MATLAB\R2013a\bin\win64\mexopts\msvc110opts.bat

Done . . .

**************************************************************************
  Warning: The MATLAB C and Fortran API has changed to support MATLAB
           variables with more than 2^32-1 elements.  In the near future
           you will be required to update your code to utilize the new
           API. You can find more information about this at:
           http://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html
           Building with the -largeArrayDims option enables the new API.
**************************************************************************

>> mex -O -largeArrayDims resize.cc
resize.cc
resize.cc(36) : error C2057: expected constant expression
resize.cc(36) : error C2466: cannot allocate an array of constant size 0
resize.cc(36) : error C2133: 'ofs' : unknown size
resize.cc(70) : error C3861: 'bzero': identifier not found
resize.cc(85) : error C2440: 'initializing' : cannot convert from 'const mwSize *' to 'const int *'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
resize.cc(95) : error C3861: 'round': identifier not found
resize.cc(96) : error C3861: 'round': identifier not found
resize.cc(98) : error C2664: 'mxCreateNumericArray_730' : cannot convert parameter 2 from 'int [3]' to 'const mwSize *'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

  D:\PROGRA~2\MATLAB\R2013A\BIN\MEX.PL: Error: Compile of 'resize.cc' failed.

Error using mex (line 206)
Unable to complete successfully.







如何修复错误行36 resize.cc?



code(resize.cc):




how do you fix error line 36 resize.cc ?

code (resize.cc):

#include <math.h>
#include <assert.h>
#include <string.h>
#include "mex.h"

/*
 * Fast image subsampling.
 * This is used to construct the feature pyramid.
 */

// struct used for caching interpolation values
struct alphainfo {
  int si, di;
  double alpha;
};

// copy src into dst using pre-computed interpolation values
void alphacopy(double *src, double *dst, struct alphainfo *ofs, int n) {
  struct alphainfo *end = ofs + n;
  while (ofs != end) {
    dst[ofs->di] += ofs->alpha * src[ofs->si];
    ofs++;
  }
}

// resize along each column
// result is transposed, so we can apply it twice for a complete resize
void resize1dtran(double *src, int sheight, double *dst, int dheight,
                  int width, int chan) {
  double scale = (double)dheight/(double)sheight;
  double invscale = (double)sheight/(double)dheight;

  // we cache the interpolation values since they can be
  // shared among different columns
  int len = (int)ceil(dheight*invscale) + 2*dheight;
  alphainfo ofs[len];
  int k = 0;
  for (int dy = 0; dy < dheight; dy++) {
    double fsy1 = dy * invscale;
    double fsy2 = fsy1 + invscale;
    int sy1 = (int)ceil(fsy1);
    int sy2 = (int)floor(fsy2);

    if (sy1 - fsy1 > 1e-3) {
      assert(k < len);
      assert(sy-1 >= 0);
      ofs[k].di = dy*width;
      ofs[k].si = sy1-1;
      ofs[k++].alpha = (sy1 - fsy1) * scale;
    }

    for (int sy = sy1; sy < sy2; sy++) {
      assert(k < len);
      assert(sy < sheight);
      ofs[k].di = dy*width;
      ofs[k].si = sy;
      ofs[k++].alpha = scale;
    }

    if (fsy2 - sy2 > 1e-3) {
      assert(k < len);
      assert(sy2 < sheight);
      ofs[k].di = dy*width;
      ofs[k].si = sy2;
      ofs[k++].alpha = (fsy2 - sy2) * scale;
    }
  }

  // resize each column of each color channel
  bzero(dst, chan*width*dheight*sizeof(double));
  for (int c = 0; c < chan; c++) {
    for (int x = 0; x < width; x++) {
      double *s = src + c*width*sheight + x*sheight;
      double *d = dst + c*width*dheight + x;
      alphacopy(s, d, ofs, k);
    }
  }
}

// main function
// takes a double color image and a scaling factor
// returns resized image
mxArray *resize(const mxArray *mxsrc, const mxArray *mxscale) {
  double *src = (double *)mxGetPr(mxsrc);
  const int *sdims = mxGetDimensions(mxsrc);
  if (mxGetNumberOfDimensions(mxsrc) != 3 ||
      mxGetClassID(mxsrc) != mxDOUBLE_CLASS)
    mexErrMsgTxt("Invalid input");

  double scale = mxGetScalar(mxscale);
  if (scale > 1)
    mexErrMsgTxt("Invalid scaling factor");

  int ddims[3];
  ddims[0] = (int)round(sdims[0]*scale);
  ddims[1] = (int)round(sdims[1]*scale);
  ddims[2] = sdims[2];
  mxArray *mxdst = mxCreateNumericArray(3, ddims, mxDOUBLE_CLASS, mxREAL);
  double *dst = (double *)mxGetPr(mxdst);

  double *tmp = (double *)mxCalloc(ddims[0]*sdims[1]*sdims[2], sizeof(double));
  resize1dtran(src, sdims[0], tmp, ddims[0], sdims[1], sdims[2]);
  resize1dtran(tmp, sdims[1], dst, ddims[1], ddims[0], sdims[2]);
  mxFree(tmp);

  return mxdst;
}

// matlab entry point
// dst = resize(src, scale)
// image should be color with double values
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
  if (nrhs != 2)
    mexErrMsgTxt("Wrong number of inputs");
  if (nlhs != 1)
    mexErrMsgTxt("Wrong number of outputs");
  plhs[0] = resize(prhs[0], prhs[1]);
}

推荐答案

手动计算行数,并猜测错误消息:

你忘了struct这个词:

Counting the lines manually, and guessing as to the error message:
You forgot the word "struct":
int len = (int)ceil(dheight*invscale) + 2*dheight;
alphainfo ofs[len];
int k = 0;

成为

Becomes

int len = (int)ceil(dheight*invscale) + 2*dheight;
struct alphainfo ofs[len];
int k = 0;

但也有可能它抱怨len需要是一个常数值。

But it's also possible it's complaining that len needs to be a constant value.


我编辑了resize.cc:



添加第5行:

i'm edited resize.cc:

add line 5:
static inline double round(double x) { return (floor(x + 0.5)); } 





编辑第36行:



edit line 36 :

struct alphainfo* ofs = (struct alphainfo*)malloc(len * sizeof(alphainfo)); 





编辑第71行:



edit line 71:

memset(dst,0, chan*width*dheight*sizeof(double));










>> mex -O resize.cc 



顺利完成。 (创建resize.mexw64)




complete successfully. (created resize.mexw64)

.


这篇关于你如何修复错误编译matlab?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆