Je cherche une fonction d'une ligne f = @(x) {something}
qui produit NaN si x> = 1 et 0 ou 1 si x < 1.Matlab: fonction rapide qui peut produire NaN si x> 1
Toutes les suggestions ?
Je cherche une fonction d'une ligne f = @(x) {something}
qui produit NaN si x> = 1 et 0 ou 1 si x < 1.Matlab: fonction rapide qui peut produire NaN si x> 1
Toutes les suggestions ?
Aha, je l'ai:
f = @(x) 0./(x<1)
rendements 0 pour x < 1 et NaN pour x> = 1.
est ici une solution qui ne risque pas jeter toute division par zéro avertissements, car il ne comporte pas de division (seulement les fonctions ONES et NAN):
f = @(x) [ones(x < 1) nan(x >= 1)];
EDIT: La solution ci-dessus est faite pour les entrées scalaires. Si une solution vectorisé est nécessaire (ce qui est clair à 100% de la question), vous pouvez modifier f
comme ceci:
f = @(x) arrayfun(@(y) [ones(y < 1) nan(y >= 1)],x);
Ou demander ARRAYFUN lorsque vous appelez la première version de la fonction f
:
y = arrayfun(f,x);
est ici une solution moins évidente (vectorisé néanmoins):
f = @(x) subsasgn(zeros(size(x)), struct('type','()','subs',{{x>=1}}), nan) + 0
Fondamentalement son équivalent à:
function v = f(x)
v = zeros(size(x));
v(x>=1) = nan;
Le +0
à la fin est toujours forcer une sortie, même si f
appelé sans argument de sortie (retour en ans
). Exemple:
>> f(-2:2)
ans =
0 0 0 NaN NaN
Voici une modification de la solution de Jason qui fonctionne pour les tableaux. Notez que les versions récentes de MATLAB ne lancent pas d'avertissements de division par zéro.
>> f = @(x) zeros(size(x)) ./ (x < 1)
f =
@(x)zeros(size(x))./(x<1)
>> f(0:.3:2)
ans =
0 0 0 0 NaN NaN NaN
Mise à jour: un collègue de travail m'a fait remarquer à cette réponse originale de Jason fonctionne très bien pour les tableaux.
>> f = @(x) 0./(x<1)
f =
@(x)0./(x<1)
>> f(0:.3:2)
ans =
0 0 0 0 NaN NaN NaN
Bon à savoir que les versions les plus récentes de MATLAB ne lancent plus d'avertissements DBZ par défaut. C'était toujours un peu ennuyeux. – gnovice
propre, mais il échoue pour l'entrée vectorielle. – Jonas
@Jonas: Vrai, bien qu'il ne soit pas évident à la question qu'une solution vectorisée était nécessaire. Je vais mettre à jour ma réponse. – gnovice
Mais sûrement, toute fonction Matlab devrait fonctionner sur les tableaux :) – Jonas