how to return two results by one output when using arrayfun()?

35 visualizaciones (últimos 30 días)
vx2008
vx2008 el 1 de Feb. de 2016
Comentada: vx2008 el 1 de Feb. de 2016
f=@(X) fun1(x);
data=arrayfun(f,xgroup);
about funtion 'fun1', now shall I return two result into the 'data' for one element of xgroup;
funtion re=fun1(x)
....
out1=x^2;
out2=x^3;
re=[out1 out2];
end
When I do like above, Matlab cant accept it; so is there some method to return several results by one 'var'?
  7 comentarios
Stephen23
Stephen23 el 1 de Feb. de 2016
My aim is to show you some good choices, but because I do not know the rest of your data processing I can't advise on which solution is best for your situation: it depends on how you are generating and handling this data.
Pick the solution that makes the most sense to you, or that you find easiest to code. (Writing code that makes sense saves more time than trying to write slightly faster code that is harder to understand and causes problems...)
For "large" data separate outputs may be faster, but the only way to check is to try both solutions and time them.
vx2008
vx2008 el 1 de Feb. de 2016
ok, thank you very much! Have fun!

Iniciar sesión para comentar.

Respuesta aceptada

Stephen23
Stephen23 el 1 de Feb. de 2016
Editada: Stephen23 el 1 de Feb. de 2016
Solution 1: You actually don't need arrayfun at all.
The simplest, neatest and fastest MATLAB code uses code vectorization, very simply like this:
>> x = [1,2,3];
>> y = x.^2
y =
1 4 9
>> z = x.^3
z =
1 8 27
Solution 2: Return TWO Outputs
function [sq,cu] = myFunTwo(x) % two outputs
sq = x^2;
cu = x^3;
end
and call it:
>> [outSqr,outCub] = arrayfun(@myFunTwo,[1,2,3])
outSqr =
1 4 9
outCub =
1 8 27
Solution 3: Use arrayfun's "UniformOutput" Option
function out = myFunOne(x) % one output
sq = x^2;
cu = x^3;
out = [sq,cu];
end
and call it:
>> outCell = arrayfun(@myFunOne,[1,2,3],'UniformOutput',false);
>> outCell{:}
ans =
1 1
ans =
4 8
ans =
9 27
The first solution is by far the simplest and fastest.

Más respuestas (1)

Guillaume
Guillaume el 1 de Feb. de 2016
It's not clear what sort of output you are looking for out of arrayfun. You have two options:
  • Use a single output function that outputs a vector, as in your example:
function re = fun1(x) %function is designed to work on scalars only
re = [x^2 , x^3]
end
If you use this function in the arrayfun call the output is non-scalar and thus you need to tell arrayfun. As a result, arrayfun will pack the outputs in a cell array:
result = arrayfun(@fun1, 1:5, 'UniformOutput', false) %create a cell array
If you want, you can then convert the cell array into a 2 column matrix:
result = vertcat(result{:})
  • Second option: Use a two outputs function and therefore have two output arrays out of arrayfun:
function [out1, out2] = fun2(x)
out1 = x^2;
out2 = x^3;
end
[re1, re2] = arrayfun(@fun1, 1:5)
You can of course concatenate the output directly into a 2d matrix:
[result(1, :), result(2, :)] = arrayfun(@fun1, 1:5)
Finally, I'll note that in this particular example, arrayfun is completely unnecessary:
result = [x.^2; x.^3] %would do the same
  1 comentario
vx2008
vx2008 el 1 de Feb. de 2016
Thank you for your time spent on this question;
I learn much from your this reply;
Thank you.

Iniciar sesión para comentar.

Etiquetas

Community Treasure Hunt

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

Start Hunting!

Translated by