23 views (last 30 days)

Show older comments

Executing the following as a script in R2018a

a=ones(1,10);

b=a;

b0=1;

fun=@(x) myFourier(x,a,b,b0);

fplot(fun);

function f=myFourier(x,a,b,b0)

n=numel(a);

arg=x(:).*(1:n);

f=b0+sin(arg)*a(:)+cos(arg)*b(:);

f=reshape(f,size(x));

end

results successfully in a plot, but throws warnings (EDIT: and results in non-vectorized execution!!!)

Warning: Function behaves unexpectedly on array inputs. To improve performance, properly vectorize your

function to return an output with the same size and shape as the input arguments.

> In matlab.graphics.function.FunctionLine>getFunction

In matlab.graphics.function.FunctionLine/updateFunction

In matlab.graphics.function.FunctionLine/set.Function_I

In matlab.graphics.function.FunctionLine/set.Function

In matlab.graphics.function.FunctionLine

In fplot>singleFplot (line 234)

In fplot>@(f)singleFplot(cax,{f},limits,extraOpts,args) (line 193)

In fplot>vectorizeFplot (line 193)

In fplot (line 163)

In test (line 7)

But the input function is properly vectorized as is easily verified in simple tests,

>> fun(rand(1,5))

ans =

3.4371 2.5677 14.1698 2.4490 1.0828

>> fun(rand(5,1))

ans =

14.1745

8.3619

-0.2579

1.7024

1.5748

Why the warnings, then?

Walter Roberson
on 31 May 2019

f1 = fun(1);

f2 = fun([1 2]);

f1 - f2(1)

ans =

4.44089209850063e-16

Your code produces different outputs for the same input, which violates the rule that the calculations must be independent.

dpb
on 31 May 2019

Because fplot is just looking at the source code, not the output and it doesn't recognize the reshape operation at the end--only that there are no "dot" operators in the evaluation from which it infers (usually correctly, but as you've shown not infallibly) that the function isn't "vectorized".

Whether there's any chance of being able to get this one right without way more parsing logic than would want to use for performance is, I'm guessing, pretty small. You can't just presume that if the user has a reshape call in the function that always works correctly, either.

dpb
on 2 Jun 2019

This could well be the basis for an enhancement/quality of implemenation improvement request.

Yair Altman
on 22 Jun 2019

As far as I can tell (never mind exactly how), internally a check is made whether the output of fun(1:3) is exactly equaln to the output of [fun(1),fun(2),fun(3)]. Even a tiny FP eps difference will cause the warning to be evoked. If you want to disable the error in run-time, run the following command:

warning off MATLAB:fplot:NotVectorized

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

Start Hunting!