How to avoid error when whether the function has returns is unknown?

조회 수: 2 (최근 30일)
function Output = PairArrayArrayfun(Function,Array1,Array2,ArrayDimension,UniformOutput)
CatDimension=max(ndims(Array1),ndims(Array2))+1;
Output=cellfun(@(Cell)Function(Cell{1},Cell{2}),PackIntoCell(cat(CatDimension,SplitIntoCell(Array1,ArrayDimension),SplitIntoCell(Array2,ArrayDimension)),CatDimension),"UniformOutput",false);
if UniformOutput
Output=cell2mat(Output);
end
end
My function accept a parameter "Function", which is expected to be a function pointer offered by the caller. However, I don't know whether this caller-offered function has any returns. In my current code, if the given function returns nothing, an error will occur.
I want my function to return nothing if the caller's function returns nothing; to return something if the caller's function returns something. How should I code?
Try-catch is a bad idea since the caller's function will be called for more than expected times. This may cause more issues if the given function has side effects.
The given function in the usecase is very likely to be anonymous, so nargout(Function) will always return -1.
The built-in function cellfun should face the same issue, and MATLAB developers successfully solved it. However, its source code is unavailable.

채택된 답변

埃博拉酱
埃博拉酱 2019년 10월 30일
This is my workaround:
function Output = PairArrayArrayfun(Function,Array1,Array2,ArrayDimension,UniformOutput)
CatDimension=max(ndims(Array1),ndims(Array2))+1;
if nargout>0
Output=cellfun(@(Cell)Function(Cell{1},Cell{2}),PackIntoCell(cat(CatDimension,SplitIntoCell(Array1,ArrayDimension),SplitIntoCell(Array2,ArrayDimension)),CatDimension),"UniformOutput",false);
if UniformOutput
Output=cell2mat(varargout);
end
else
cellfun(@(Cell)Function(Cell{1},Cell{2}),PackIntoCell(cat(CatDimension,SplitIntoCell(Array1,ArrayDimension),SplitIntoCell(Array2,ArrayDimension)),CatDimension),"UniformOutput",false);
end
end
In this way the responsibility to judge output is kicked back to the caller. It seems clumsy but may be how the built-in cellfun works.
  댓글 수: 4
Daniel M
Daniel M 2019년 10월 30일
Right, but you shouldn't have to leave it up to the user. You can do both things. You can call nargout(Function) to find out how many outputs there should be, and reflect that in how your function behaves. You can also check nargout() too.
埃博拉酱
埃博拉酱 2019년 10월 30일
@Daniel M
nargout(Function) is unreliable. If it returns -1, that means Function returns varargout. A varargout return could be nothing! abs(nargout(Function))>0 doesn't assure the Function of any returns.

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

Daniel M
Daniel M 2019년 10월 29일
편집: Daniel M 2019년 10월 29일
You can use nargout(Function) to check the number of output arguments. <https://www.mathworks.com/help/matlab/ref/nargout.html>
  댓글 수: 4
Walter Roberson
Walter Roberson 2019년 10월 30일
In my opinion it is a bug in the function design to define a varargout function that returns no output if requested by the user. That said, I have seen it in a couple of Mathworks functions.
埃博拉酱
埃博拉酱 2019년 10월 30일
편집: 埃博拉酱 2019년 10월 30일
@Walter Roberson Anonymous functions are always supposed to return varargout by nargout, even for those ones that really return nothing. In this usecase the given function is very likely to be anonymous, unfortunately.

댓글을 달려면 로그인하십시오.


Walter Roberson
Walter Roberson 2019년 10월 30일
try/catch the first execution outside of the cellfun. If the assignment works then cellfun the rest of the iterations. If it fails then you will need to loop instead of cellfun.
cellfun cannot be used with functions that produce no output.
  댓글 수: 1
埃博拉酱
埃博拉酱 2019년 10월 30일
You're wrong. cellfun really can work with no-return functions, at least for R2019b

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Graphics Object Programming에 대해 자세히 알아보기

제품


릴리스

R2019b

Community Treasure Hunt

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

Start Hunting!

Translated by