Solved my problem - used the C math library exp() and log() functions in the MEX .c file. Seemed like cheating to not call the Matlab functions, but it works.
How to code a MEX file for a function with logical tests on array values
2 views (last 30 days)
Show older comments
I have the following function coded as an m-file:
_______
function y = phiabs(x)
% returns log((e^|x| + 1)/(e^|x| - 1))
if x < 0
x = -x;
end
if (x >= 1e-12) && (x <= 30.)
z = exp(-x);
y = log((1. + z)/(1. - z));
elseif x > 30
y = 2. * exp(-x);
else
y = log(2./(x + 1e-100));
end
______
If I try to apply it to an array or matrix, the "if" tests give trouble. To code it as a MEX file would involve individual calls to log() and exp() via mexCallMATLAB() for each element. Is there a more efficient way?
0 Comments
Accepted Answer
More Answers (1)
Jan
on 3 Apr 2014
Instead of calling a MEX function, you could get rid of the problems occurring for the IF statement when processing arrays:
function y = phiabs(x)
x = abs(x);
y = zeros(size(x));
idx = (x > 30);
y(idx) = 2.0 * exp(-x(idx));
idx = ~idx & x >= 1e-12;
z = exp(-x(idx));
y(idx) = log((1 + z) ./ (1 - z));
idx = (x < 1e-12);
y(idx) = log(2 / (x(idx) + 1e-100));
end
0 Comments
See Also
Categories
Find more on Install Products in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!