Effacer les filtres
Effacer les filtres

(Matlab Coder)Domain error. To compute complex results from real x, use 'acosd(complex(x))'

5 vues (au cours des 30 derniers jours)
When I try to evaluate an acosd value, the generated mex execution is not consistent with the original function and often errors out?
function out = triFun(in)%#codegen
out = real(acosd(in));
end
I use the following statement to generate successfully:
codegen -config:mex triFun.m -args {0.5}
Then test it with the following statement:
for i = 1:10
a = rand(1,2);
b = a;
distA = sqrt(a(1).^2+a(2).^2);
distB = sqrt(b(1).^2+b(2).^2);
val = dot(a,b)./(distA.*distB);
out1 = triFun(val) % always OK
out2 = triFun_mex(val) % sometimes failed, Domain error. To compute complex results from real x, use 'acosd(complex(x))' ???
end
output error:
test_codegen_mex
out1 =
0
Domain error. To compute complex results from real x, use 'acosd(complex(x))'.
Error in acosd (line 13)
coder.internal.error('Coder:toolbox:ElFunDomainError',mfilename);
Error in triFun (line 2)
out = real(acosd(in));
Error in test_codegen_mex (line 12)
out2 = triFun_mex(val) % sometimes failed, Domain error. To compute complex results from real x, use 'acosd(complex(x))' ???
Question:
Obviously, the a,b I gave are equal and the val value should be equal to 1. There will be no complexity, but out2 will mistake the result for a complex number and out1 will not. How can I modify this to achieve the goal of consistent results?
Run In Matlab R2023a

Réponse acceptée

Bruno Luong
Bruno Luong le 28 Sep 2023
Modifié(e) : Bruno Luong le 28 Sep 2023
"Obviously, the a,b I gave are equal and the val value should be equal to 1"
wrong. Before claming anything, you should first check.
format long
while true
a = rand(1,2);
b = a;
distA = sqrt(a(1).^2+a(2).^2);
distB = sqrt(b(1).^2+b(2).^2);
val = dot(a,b)./(distA.*distB);
if abs(val) > 1
a
b
val
exceedvalto1 = val-1
fprintf('val can not be == 1 with numerical error\n')
break
end
end
a = 1×2
0.894442198246962 0.268453115545912
b = 1×2
0.894442198246962 0.268453115545912
val =
1.000000000000000
exceedvalto1 =
2.220446049250313e-16
val can not be == 1 with numerical error
Fix: you need to truncate val by safety
val = max(min(val,1),-1);
before calling acosd

Plus de réponses (0)

Produits


Version

R2023b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by