How to define a piecewise anonymous function

Hello everyone,
the example code
syms x
continuous_function = x^2+x;
matlabFunction(continuous_function,'Vars',x)
gives me the anonymous function
@(x)x+x.^2
I would like a similar result for piecewise functions. However, the code
syms x
piecewise_function = piecewise( 0<x<1, x, 'otherwiseVal', 0 );
matlabFunction(piecewise_function,'Vars',x)
does not work.
Thanks for any help!

 採用された回答

Star Strider
Star Strider 2019 年 5 月 31 日

11 投票

You need to use ‘logical indexing’:
piecewise_function = @(x) (x.^2+x) .* ((0<x) & (x<1));
x = linspace(-1, 2);
figure
plot(x, piecewise_function(x))
producing:
How to define a piecewise anonymous function - 2019 05 31.png

11 件のコメント

Stephan
Stephan 2019 年 5 月 31 日
Thank you!
Do I understand you correctly that there is no function that converts
piecewise_function = piecewise( 0<x<1, x^2+x, 'otherwiseVal', 0 );
to
@(x) (x.^2+x) .* ((0<x) & (x<1))
Star Strider
Star Strider 2019 年 5 月 31 日
Yes.
This code:
syms x
piecewise_function = piecewise( 0<x<1, x^2+x, 'otherwiseVal', 0 );
matlabFunction(piecewise_function)
throws this error:
Error using symengine
Unable to generate code for piecewise for use in anonymous functions.
(and some others).
The construction I use here appears to be the only way. Various such expressions can be combined in one function to create piecewise functions across various intervals, for example:
piecewise_function = @(x) (x.^2+x) .* ((0<x) & (x<1)) + (x+sqrt(x)).*((x>=1) & (x<1.5));
So all is not lost.
Stephan
Stephan 2019 年 5 月 31 日
Thank you for this useful remark!
Star Strider
Star Strider 2019 年 5 月 31 日
As always, my pleasure!
ElPerroVerde
ElPerroVerde 2020 年 5 月 16 日
THANK YOU SO MUCH!!!!!!!!!!!! I've been looking for something like this for months!!!
Star Strider
Star Strider 2020 年 5 月 16 日
ElPerroVerde — My pleasure!
A Vote would be appreciated!
.
Roy Goodman
Roy Goodman 2025 年 10 月 29 日
How can we modify this to take the value NaN outside the interval [0 1]?
Roy Goodman
Roy Goodman 2025 年 10 月 29 日
MATLAB Copilot returns code that fails!
Torsten
Torsten 2025 年 10 月 29 日
編集済み: Torsten 2025 年 10 月 29 日
piecewise_function = @(x) (x.^2+x) + 0./((0<=x) & (x<=1));
x = linspace(-1, 2);
figure
plot(x, piecewise_function(x))
Walter Roberson
Walter Roberson 2025 年 10 月 29 日
syms x
f = piecewise((0<=x) & (x<=1),x.^2+x,nan)
f = 
piecewise_function = matlabFunction(f, 'file', 'test_piecewise.m')
piecewise_function = function_handle with value:
@test_piecewise
dbtype test_piecewise
1 function f = test_piecewise(x) 2 %TEST_PIECEWISE 3 % F = TEST_PIECEWISE(X) 4 5 % This function was generated by the Symbolic Math Toolbox version 25.2. 6 % 29-Oct-2025 22:14:42 7 8 t2 = ((0.0 <= x) & (x <= 1.0)); 9 if ~all(cellfun(@isscalar,{t2})) 10 error(message('symbolic:sym:matlabFunction:ConditionsMustBeScalar')); 11 end 12 if (t2) 13 f = x+x.^2; 14 else 15 f = NaN; 16 end 17 end
x = linspace(-1, 2);
plot(x, arrayfun(piecewise_function, x))
xline([-1 2])
Roy Goodman
Roy Goodman 2025 年 10 月 30 日
Thanks!

サインインしてコメントする。

その他の回答 (1 件)

Walter Roberson
Walter Roberson 2020 年 5 月 16 日

0 投票

If you use matlabFunction with 'file' option, then it will convert piecewise() into if/else in the generated code.
Note: because it uses if/else instead of logical indexing, the generated code will not be vectorized on that variable.

質問済み:

2019 年 5 月 31 日

コメント済み:

2025 年 10 月 30 日

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by