2014-11-12 1 views
0

Эй, у меня есть issuse с построением собственной функции в scilab. Я хочу построить следующую функциюЗадание собственной функции в scilab

function f = test(n) 
if n < 0 then 
    f(n) = 0; 
elseif n <= 1 & n >= 0 then 
    f(n) = sin((%pi * n)/2); 
else 
    f(n) = 1; 
end 
endfunction 

, за которой следует команда консоли

x = [-2:0.1:2]; 
plot(x, test(x)); 

я загрузил функцию и получить следующее сообщение об ошибке

- ошибка 21 Invalid Индекс. в строке 7 функции Lala наречено:
участка (х, тест (х))

Можете ли вы сказать мне, как я могу исправить эту

ответ

0

Так я теперь сделал это с цикл , Я не думаю, что это лучшее решение, но я не могу получить остальные работает атм ...

function f = test(n) 

    f = zeros(size(n)); 

    t = length(n); 
    for i = 1:t 
     if n(i) < 0 then 
      f(i) = 0; 
     elseif n(i) <= 1 & n(i) >= 0 
      f(i) = sin((%pi * n(i)/2)); 
     elseif n(i) > 1 then 
      f(i) = 1; 
     end 
    end 

endfunction 

Я думаю, мне нужно найти источник об этой проблеме и привыкают с особенностями и перки Matlab/Scilab должны более :) Спасибо за помощь Тхо

0

Оригинальный грех

function f = test(n) 
    (...) 
    f(n) = (...) 
    (...) 
endfunction 

f должен быть результатом функции. Поэтому f(n) не является «значением, которое функция test принимает аргумент n», но «n-й элемент f». Scilab затем обрабатывает это, но это возможно; в вашем тестовом примере он пытается получить доступ к нецелочисленному индексу, что приводит к ошибке. Решение вашей петли решает проблему.

Замена всех трех f(n)f в вашей первой формулировке делает это чем-то, что работает ... до тех пор, пока аргумент является скаляром (а не массивом).

Если вы хотите, чтобы test принимал векторные аргументы без создания цикла, проблема в том, что n < 0 - это вектор того же размера, что и n. Мое решение будет использовать логические массивы для индексации каждого из трех условий:

function f = test(n) 

    f = zeros(size(n)); 
    negative = (n<0);//parentheses are optional, but I like them for readability 
    greater_than_1 = (n>1); 
    others = ~negative & ~greater_than_1; 

    f(isnegative)=0; 
    f(greater_than_1)=1; 
    f(others) = sin(%pi/2*n(others)); 

endfunction