How to tell an multi-output anonymous function to vectorize its output components which are constant

1 view (last 30 days)
Hello friends,
I have an apparently simple but very annoying problem. Consider the function handle
f=@(x,y) [x+y;2;x*y;x^2-1;3];
When I want to calculate the expression f([1 2],3) then matlab gives an error message ('mismatch between dimensions'). Of course, I can easily fix this problem by re-defining the above function handle as
f=@(x,y) [x+y;2+x-x;x*y;x^2-1;3+x-x];
However, the problem is that my anonymous function is defined whithin a for-loop where I cannot mannually add x-x to the constants plus that
I do not know beforehand which outputs are constant and which are not. The natural way to fix this problem seems to be to update f like
f=@(x,y) f(x,y)+[0;x-x;0;0;x-x];
But, this trick does not work, unfortunately.
It is greatly appreciated if anybody has an idea how to fix this really annoying problem.
Thanks in advance
Babak Shojaei Arani

Accepted Answer

Matt J
Matt J on 16 Oct 2021
Edited: Matt J on 16 Oct 2021
One way,
f=@(x,y) completeRows({x+y;2;x*y;x.^2-1;3});
f([1 2],3)
ans = 5×2
4 5 2 2 3 6 0 3 3 3
function out=completeRows(C)
n=max(cellfun('length',C));
for i=1:numel(C)
if isscalar(C{i}), C{i}=repelem(C{i},1,n); end
end
out=cell2mat(C);
end

More Answers (0)

Categories

Find more on Argument Definitions in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!