Что не так с моей функцией в Octave? - PullRequest
2 голосов
/ 22 мая 2011

Я только что попытался создать свою первую функцию в октаве, она выглядит следующим образом:

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

но если я попытаюсь построить его, используя: x=0:0.1:10; plot(x, hui(x));

Это показывает, что заговор ведьмы кажется немного странным. enter image description here

Что я не так сделал?

Спасибо заранее John

Ответы [ 2 ]

3 голосов
/ 22 мая 2011

Вам придется простить мою ржавость с пакетом, но вам нужно немного изменить код. Примечательно, что запись 0<=x неверна и должна быть x>=0. Поскольку hui работает с вектором, я считаю, что вы должны учитывать это при построении возвращаемого значения.

Я уверен, что есть более эффективные способы векторизации этого, но в основном, переступая через входной вектор, я добавил последнее значение к вектору возврата, и в конце отрубил начальный 0, который я вставил в Я вставил дозорное значение в случае, если входные данные не соответствовали одному из критериев (в вашем коде всегда использовался путь "else", поэтому размещение чего-то там могло предупредить вас о том, что что-то не так).

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 голос
/ 22 мая 2011

x - это вектор, поэтому вам нужно либо пройти через него, либо векторизовать свой код, чтобы устранить необходимость.

Поскольку вы используете Octave, стоит векторизовать все, что возможно.Самый простой способ сделать это:

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;

Синтаксис y(x >= a & x < b) - это логическое индексирование.В одиночку x >= a & x < b дает вам вектор логических значений, но в сочетании с другим вектором вы получаете значения, которые удовлетворяют условию.Octave также позволит вам выполнять такие задания.

...