gpt4 book ai didi

c - mex 代码在新的 matlab 版本/架构上崩溃

转载 作者:行者123 更新时间:2023-12-02 03:49:26 26 4
gpt4 key购买 nike

我有一个例程可以在频域中计算移不变离散小波变换,如 Rice Wavelet Toolbox 中指定的那样。代码采用 MEX(c 语法)并使用一些额外的例程来执行虚多项式 etc。在一个单独的文件中。

源文件 fsidwt.c、fisidwt.c 和辅助例程 polyphase.[chm] 一起压缩在一个文件中:http://ubuntuone.com/6zXIIuA3J4OTTlSquycMlz

此代码在较旧的 matlab 版本中没有问题,其他 matlab 函数依赖于它。

但是现在,当我现在编译它时,首先会出现一条警告消息

>> mex fisidwt.c polyphase.c % message about different gcc version
>> mex fsidwt.c polyphase.c % message about different gcc version
fsidwt.c: In function ‘multiMRFWD1D’:
fsidwt.c:187: warning: cast to pointer from integer of different size
fsidwt.c:188: warning: cast to pointer from integer of different size
fsidwt.c:189: warning: cast to pointer from integer of different size
fsidwt.c:190: warning: cast to pointer from integer of different size

这很奇怪,因为没有整数被转换为指针。但这只是一个警告,让我们继续吧。

现在,mex 文件 fsidwt 和 fisidwt 计算正向和反向频域平移变量小波变换。

我的测试程序很简单:

>> clear all; len_sig=256; wlevels=3; numsig=1; numtest=1; 
% 256 points, 3 wavelet decomposition levels
>> st=4; ts=(1:(len_sig/st))'*(1:st); ts=ts(:); ts=ts*ones(1,numsig); Ts=fft(ts);
% sawtooth with 4 'teeth' of increasing height and its FFT
>> h=[1;1]/sqrt(2); g=qmf(h); h=[h(:) g(:)]; H=fft(h,len_sig);
% Haar wavelet filters and 256-point FFTs
>> [ffs ffd] = fsidwt(Ts, H, wlevels);
% forward wavelet transform
>> ffr=fisidwt(ffs,ffd,cH,levels);
% recontruction

不幸的是,它以分段违规退出,其原因我无法从核心转储输出中追踪...

代码中的行 [在 http://ubuntuone.com/6zXIIuA3J4OTTlSquycMlz 的压缩文件中],fsidwt.c 的行号 187-190,阅读:

Hfilter2d = (dComplexMat) dComplexMake2D ( hcomp[0],  NQ, Q);
Gfilter2d = (dComplexMat) dComplexMake2D ( hcomp[1], NQ, Q);
Detail2d = (dComplexMat) dComplexMake2D ( workspaced, Q, NQ);
Approx2d = (dComplexMat) dComplexMake2D ( workspacec, Q, NQ);

所有的LHS都是类型

dComplexMat

这是

typedef struct {double r,i;} dComplex;
typedef dComplex *dComplexVec;
typedef dComplexVec *dComplexMat;

所有的RHS都是类型

(dComplexVec, long, long)

dComplexMake2D() 的代码是:

dComplexMat dComplexMake2D(
dComplexVec array1D,
int width, int height) {
register int i;
dComplexMat theMatrix = (dComplexMat) mxCalloc ( width, sizeof(dComplexVec) );
theMatrix[0]=(dComplexVec)array1D;
for(i=1;i<width;i++)
theMatrix[i] = theMatrix[i-1] + height;
return theMatrix;
}

我将如何开始查找此分段违规的原因?它与警告有关吗?它是新的Matlab版本吗?还是 64 位架构?

最佳答案

亲爱的。 MathWorks 服务台在调查此问题时发现,dComplexMake2D 的函数头有一个额外的 d,我一定至少忽略了 42 次。

好尴尬。但无论如何,代码像梦一样工作(很快就会上线)和一个教训:

MEX 对 dComplexMake2D 的返回类型发出警告,因为它找不到匹配的 header ,继续(看起来是这样)但假定返回类型 int,已链接到编译后的文件,其中 dComplexMake2D 返回一个指针(一个 long int 大小的类型),这就是出错的地方......

感谢 MathWorks 的技术支持。他们确实指出,调试 MEX 文件与他们无关。

关于c - mex 代码在新的 matlab 版本/架构上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15024059/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com