How to display the selected function from a switch case statement

4 次查看(过去 30 天)
Hi all,
I have a switch cases statement with selects the best in terms of RMSE fitting sinusoid function to my dataset. My question is how to display in the Command window the mathematical expression of the selected function. The code is like this.
function [RMSE,ltsc] = ltsc_scoref(A,data,period,fun)
%LTSC_SCOREF Long term seasonal component score function with square error.
% Written by Rafal Weron (2009.08.18)
% Copyright (c) 2009 by Rafal Weron
N = length(data);
x = (1:N)'/period;
switch fun
case 1 % sinusoid with linear trend
ltsc = A(1).*sin( 2.*pi.*(x+A(2)) ) + A(3) + A(4)*x;
% disp('A(1).*sin( 2.*pi.*(x+A(2)) ) + A(3) + A(4)*x')
case 2 % sinusoid with cubic trend
ltsc = A(1).*sin( 2.*pi.*(x+A(2)) ) + A(3) + A(4)*x + A(5)*x.^2;
%disp('A(1).*sin( 2.*pi.*(x+A(2)) ) + A(3) + A(4)*x + A(5)*x.^2')
case 3 % sinusoid with linear trend and linear amplitude
ltsc= (A(1) + A(6)*x).*sin( 2.*pi.*(x+A(2)) ) + A(3) + A(4)*x;
%disp('A(1) + A(6)*x).*sin( 2.*pi.*(x+A(2)) ) + A(3) + A(4)*x')
case 4 % sinusoid with cubic trend and linear amplitude
ltsc = (A(1) + A(6)*x).*sin( 2.*pi.*(x+A(2)) ) + A(3) + A(4)*x + A(5)*x.^2;
%disp('(A(1) + A(6)*x).*sin( 2.*pi.*(x+A(2)) ) + A(3) + A(4)*x + A(5)*x.^2')
case 5 % 2 sinusoids with cubic trend and linear amplitude
ltsc = (A(1) + A(6)*x).*( sin( 2.*pi.*(x+A(2)) ) + sin( pi.*(x+A(2)) ) )+ A(3) + A(4)*x + A(5)*x.^2;
%disp('(A(1) + A(6)*x).*( sin( 2.*pi.*(x+A(2)) ) + sin( pi.*(x+A(2)) ) )+ A(3) + A(4)*x + A(5)*x.^2')
end
% subtract level and compute score (sum of squared errors, SSE)
RMSE = ( mean( (abs(data - ltsc)).^2 ) )^0.5;
disp(sprintf('ltsc= %g', ltsc));
end
What I would like to see is that if for example case 3 is selected: ltsc= (A(1) + A(6)*x).*sin( 2.*pi.*(x+A(2)) ) + A(3) + A(4)*x; Thanks

回答(2 个)

John D'Errico
John D'Errico 2016-11-22
编辑:John D'Errico 2016-11-22
Hint:
A= [2 3 5];
disp([num2str(A(1)),'.*X + ',num2str(A(2)),'.*Y + ',num2str(A(3))])
2.*X + 3.*Y + 5
The above is only a complete guess as to what you intend. Note that it can be pretty easily extended to a general case, where you write a small helper function that takes a list of terms and coefficients, then creates a string. With just a wee bit of effort, you can make it handle a general nonlinear case. But you need to decide how generally nonlinear a function you may have.
The point is, write a simple function that will take some functional form, with a coefficient or coefficients, returning a string. Then just loop over the terms, and build up a complete string of terms. (Not difficult, since I recall doing exactly this many years ago.)
As I said, only a guess though.

Stephen23
Stephen23 2016-11-22
编辑:Stephen23 2016-11-22
You can use func2str:
>> fun = @(x,y) sqrt(x) + sin(y);
>> str = func2str(fun)
str = @(x,y)sqrt(x)+sin(y)

Community Treasure Hunt

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

Start Hunting!

Translated by