MATLAB | f = @ (x) дескриптор функции с range + conv - PullRequest
0 голосов
/ 02 мая 2020

У меня есть эти функции с кодом, который направлен на построение двух сигналов - x (t) и h (t) - вместе с их диапазоном времени, а затем находим свертку двух сигналов.

View Functions

x=@(t) 2.*((-2<=t&&t<=1)+2).^2.*18.*(2<=t&&t<=3).*-9.*((4<=t&&t<=5)-5);
tx=-2:0.01:5;

h=@(t) 3*(0<=t&&t<=2) -6*((4<=t&&t<=4)-3);
th=0:0.01:4;

c=conv(x(tx),h(th));
tc=(tx(1)+th(1)):0.01:(tx(end)+th(end));

figure(1)
subplot(3,1,1); plot(tx,x(tx));
subplot(3,1,2); plot(th,h(th));
subplot(3,1,3); plot(tc,c);

Однако я получил эту ошибку.

Operands to the || and && operators must be convertible to logical scalar values.
Error in @(t)2.*((-2<=t&&t<=1)+2).^2.*18.*(2<=t&&t<=3).*-9.*((4<=t&&t<=5)-5)

Я хочу использовать дескриптор функции для их построения. Есть ли способ решить эту проблему?

Заранее спасибо за ваши ответы.

1 Ответ

1 голос
/ 02 мая 2020

Сообщение об ошибке довольно ясно о проблеме: двойные операторы && и || подходят только для скалярных значений (они называются операторы короткого замыкания ). Для векторных вычислений используйте их отдельные версии & и | (так называемые поэлементные операторы .

Различие имеет решающее значение, если оно возникает to runtime:

При логическом коротком замыкании второй операнд expr2 оценивается только в том случае, если результат не полностью определяется первым операндом expr1.

просто измените свой код на

x = @(t) 2.*( ((-2 <= t) & (t <= 1)) +2).^2.*18.*((2 <= t) & (t <= 3)).*-9.*( ((4 <= t) & (t <= 5)) -5);
h = @(t) 3*((0 <= t) & (t <= 2)) -6*( ((4 <= t) & (t <=4) ) -3);

ADDED Хотя это был не ваш ответ, вы можете получить желаемый график с помощью следующего фрагмента

% upper level
upLvl = 17;
x_cnst = @(t) upLvl.*(t>=1 & t<3);
x_lin = @(t) (upLvl-(upLvl/2.*(t-3))).*(t>=3 & t<=5);
x_exp = @(t) upLvl/exp(3)*exp(t+2).*(t<1);
x = @(t) x_exp(t) + x_cnst(t) + x_lin(t);

h = @(t) 3.*t.*(t < 2) +(6-3.*(t-2)).*( t >= 2);

Я сломал функция разбита на отдельные разделы для лучшего обзора, тем не менее, я рекомендую скорее написать полную функцию с операторами if - elseif, чем использовать дескрипторы анонимных функций в этом случае.

...