你如何修复错误编译matlab? [英] how do you fix error compile matlab ?
本文介绍了你如何修复错误编译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屋!
查看全文