2011-05-21 3 views
2

Je viens d'essayer de créer ma première fonction en octave, il se présente comme suit:Quel est le problème avec ma fonction dans Octave?

function hui(x) 
if(0 <= x && x <2) 
    retval = (1.5 * x + 2) 
elseif(2<= x && x <4) 
    retval = (-x + 5) 
elseif(4<= x && x < 6) 
    retval = (0.5 * x) 
elseif(6<= x && x < 8) 
    retval = (x - 3) 
elseif(8<= x && x <=10) 
    retval = (2 * x - 11) 
endif 
endfunction 

mais si je tente de tracer à l'aide: x=0:0.1:10; plot(x, hui(x));

Il montre une sorcière intrigue semble un peu étrange. enter image description here

Qu'est-ce que je me suis trompé?

Merci à l'avance John

Répondre

3

Vous devez pardonner mon rustiness avec le paquet, mais vous devez changer le code un peu. Notamment, la notation 0<=x est incorrecte et doit être x>=0. Puisque hui fonctionne sur un vecteur, je crois que vous devez en tenir compte lors de la construction de votre valeur de retour. Je suis sûr qu'il y a des moyens plus efficaces de vectoriser ceci, mais fondamentalement, tout en enjambant le vecteur d'entrée, j'ai ajouté la dernière valeur sur le vecteur de retour, et à la fin d'écarter le 0 initial que j'avais mis dans. J'ai mis une valeur sentinelle au cas où l'entrée ne remplirait pas l'un des critères (elle prenait toujours le chemin "else" dans votre code, donc mettre quelque chose là-bas aurait pu vous avertir que quelque chose n'allait pas).

function [retval] = hui(x) 
retval = 0 
for i=1:size(x,2) 
    if(x(i)>=0 && x(i) <2) 
     retval = [retval (1.5 * x(i) + 2)]; 

    elseif(x(i)>=2 && x(i) <4) 
     retval = [retval (-1*x(i) + 5)]; 

    elseif(x(i)>=4 && x(i) < 6) 
     retval = [retval (0.5 * x(i))]; 

    elseif(x(i)>=6 && x(i) < 8) 
     retval = [retval (x(i) - 3)]; 

    elseif(x(i)>=8 && x(i) <=10) 
     retval = [retval (2 * x(i) - 11)]; 

    else 
     retval = -999; 

    endif 

endfor 
    retval = retval(2:size(retval,2)); 
endfunction 
1

x est un vecteur, vous devez soit faire une boucle à travers elle ou vectoriser votre code à supprimer la nécessité. Comme vous utilisez Octave, cela vaut la peine de vectoriser tout ce que vous pouvez. La meilleure façon que je peux penser à faire est:

x = 0:0.1:10; 
y = x; 
y(x >= 0 & x < 2) = x(x >= 0 & x < 2) * 1.5 + 2; 
y(x >= 2 & x < 4) = x(x >= 2 & x < 4) * -1 + 5; 
y(x >= 4 & x < 6) = x(x >= 4 & x < 6) * 0.5; 
y(x >= 6 & x < 8) = x(x >= 6 & x < 8) - 3; 
y(x >= 8 & x < 10) = x(x >= 8 & x < 10) * 2 - 11; 

La syntaxe est y(x >= a & x < b) indexation logique. Seul, x >= a & x < b vous donne un vecteur de valeurs logiques, mais combiné avec un autre vecteur vous obtenez les valeurs qui répondent à la condition. Octave vous permettra également de faire des missions comme celle-ci.

Questions connexes