使用仪器化Mex函数提出定点数据类型

时间:2014-03-10 07:43:02

标签: matlab function fixed mex

这是我的matlab功能:

function [mask] = computeMask (I, threshold, win_var, borderx, bordery)
coder.extrinsic('imfilter');
%-- compute Variances of the RGB and IR patches 
mean_I = imfilter(I,ones(win_var)/win_var/win_var,'same','symmetric','conv');
mean2_I = imfilter(I.^2,ones(win_var)/win_var/win_var,'same','symmetric','conv');
std_I= real(sqrt(mean2_I-mean_I.^2)+1e-5);
mask= std_I>threshold;
% add the border of the image to the mask 
% (filters are not complete at the border)
mask(1:((bordery-1)/2),:)=0;
mask((end-(bordery-1)/2):end,:)=0;
mask(:,1:((borderx-1)/2))=0;
mask(:,(end-(borderx-1)/2):end)=0;
% add the area where the vignetting is too strong
Cy=floor(size(mask,1)/2);
Cx=floor(size(mask,2)/2);
[x,y]=meshgrid(1:size(mask,2),1:size(mask,1));
mask(((x-Cx).^2+(y-Cy).^2)>8e4)=0;
%mask(((x-Cx).^2+(y-Cy).^2)>1.3e4)=0;
return

当尝试构建Build“Instrumented MEX Function”时,我得到以下错误:?? *?预期逻辑,char,int,fi,single或double。找到了一个mxArray。 MxArrays从对MATLAB解释器的调用返回,并且在表达式中不受支持。它们可能只用于赋值的右侧,也可用作外在函数的参数。*

==>中的错误computeMask行:21列:18:std_I = real(sqrt(mean2_I-mean_I。^ 2)+ 1e-5);

如何解决这些问题?请帮我 !!!非常感谢你

1 个答案:

答案 0 :(得分:1)

由于您将imfilter声明为外在的,因此生成的代码将调用MATLAB来运行此函数。这将导致mXArray类型。为了帮助编码器将mxArray类型转换为本机类型,您应该在调用imfilter之前初始化imfilter的输出。例如,如果imfilter的输出与其输入I的类型和大小相同,则使用

mean_I = I;
mean_I = imfilter(I,ones(win_var)/win_var/win_var,'same','symmetric','conv');

请注意,imfilter仍然不会生成任何代码。 imfilter仍在MATLAB中调用。

您可以在http://www.mathworks.com/help/fixedpoint/ug/calling-matlab-functions.html的“将mxArrays转换为已知类型”部分中查看相关文档。