Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

New to MATLAB?

Applying a constant function on a vector

Asked by Jose

Jose

on 22 Nov 2012

Hi,

I am writing a program for school. I need the user to input a function as a string, and then I need to process it.

What I am doing:

f = vectorize(inline(user_input_string));
x = linspace(0, 20, 20);
y = f(x);
...

This works perfectly except when the user inputs a constant function (such as f = 1). In order for my project to work, y must be a vector. But if the user inputs a constant function, Matlab automatically sets y to a sclalar, instead of a vector.

What can I do?

0 Comments

Jose

Jose

Products

No products are associated with this question.

5 Answers

Answer by Star Strider

Star Strider

on 22 Nov 2012
Edited by Star Strider

Star Strider

on 22 Nov 2012

I'm not certain I completely understand your problem. However, you could test for a scalar and if something like f=1 was the input, perhaps set y to:

f = '1';
y = polyval(str2num(f), x);

If the test for a scalar was true, you could also consider something like:

user_input_string = sprintf('polyval(%s, x)', f);

Without knowing more, that's the best solution I can come up with.

2 Comments

Jose

Jose

on 22 Nov 2012

No, that won't solve it. I'll explain better:

- the user inputs a function

- i apply the function on a vector (linspace(0, 20, 100))

- then i want to get a vector i can use later on a internal product

- however, if the function e constant (let's say, f = 1), if i apply the function on the vector, i don't get another vector, i get a scalar.

Hope it's is clearer now.

Star Strider

Star Strider

on 22 Nov 2012

If the user inputs a constant, what output for user_input_string do you want?

The polyval function outputs a vector of constant values equal to the scalar input value with a length equal to the length of your x-vector. It's the only option I can think of that's compatible with your user_input_string variable.

The version I posted earlier assumes the scalar is read in as a string. If you read f in as a numeric value instead, replace the %s with %f:

user_input_string = sprintf('polyval(%f, x)', f);
Star Strider

Star Strider

Answer by Walter Roberson

Walter Roberson

on 22 Nov 2012
if length(y) == 1; y = y(ones(size(x))); end

0 Comments

Walter Roberson

Walter Roberson

Answer by Matt J

Matt J

on 22 Nov 2012
Edited by Matt J

Matt J

on 22 Nov 2012
    f = inline(user_input_string);
    fh=@(x) f(x);
    x = linspace(0, 20, 20);
    y = arrayfun(fh,x);

0 Comments

Matt J

Matt J

Answer by Jose

Jose

on 23 Nov 2012

Thanks guys!

0 Comments

Jose

Jose

Answer by Matt Fig

Matt Fig

on 23 Nov 2012

You can specify the variable in your call to INLINE. For example, this works even if the user enters 2:

f = vectorize(inline(input('Enter a func of x : ','s'),'x'));

2 Comments

Matt J

Matt J

on 23 Nov 2012

No, it doesn't work around the issue cited by the OP. The code still gives

>> f(1:10)
ans =
1

whereas the desired output is ones(1,10).

Matt Fig

Matt Fig

on 23 Nov 2012

Ah, good catch...

I guess we could get fancy.

S = input('Enter a func of x : ','s');
f = vectorize(inline([S,'+zeros(size(x),class(x))'],'x'));

But, yuck.

Matt Fig

Matt Fig

Contact us