## Applying a constant function on a vector

### Jose (view profile)

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?

## Products

No products are associated with this question.

### Star Strider (view profile)

on 22 Nov 2012
Edited by Star Strider

### Star Strider (view profile)

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.

Jose

### Jose (view profile)

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 (view profile)

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);
```

### Walter Roberson (view profile)

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

on 22 Nov 2012
Edited by Matt J

### Matt J (view profile)

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

on 23 Nov 2012

Thanks guys!

### Matt Fig (view profile)

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'));
```

Matt J

### Matt J (view profile)

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 (view profile)

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.

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