2010-10-04 49 views

Répondre

5

Aha, je l'ai:

f = @(x) 0./(x<1) 

rendements 0 pour x < 1 et NaN pour x> = 1.

2

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); 
+1

propre, mais il échoue pour l'entrée vectorielle. – Jonas

+0

@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

+2

Mais sûrement, toute fonction Matlab devrait fonctionner sur les tableaux :) – Jonas

2

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 
+1

pas besoin de 'find'. Je préfère cette fonction, car c'est l'implémentation la plus propre qui fonctionne également pour les tableaux. – Jonas

+0

c'est vrai, merci Jonas – Amro

5

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 
+0

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