MATLAB Answers

How to shadow the built-in find function

25 views (last 30 days)
Rik
Rik on 3 Mar 2018
Commented: Rik on 5 Mar 2018
A while ago I have written a FEX submission that extends the capabilities of find to also work for 3D and up: findND (e.g. a syntax like [x,y,z,val]=findND(A)).
I would like to be able to shadow the built-in function, so I have the option of simply using [x,y,z,val]=find(A) in my code. My function would then use the code from this previous question to get a handle to the built-in function, so my function catches the call to find and does its thing if it needs to. Based on this question, I would have thought that it would be relatively easy to do this: just ignore the warning.
However, when I try this, it doesn't work: Matlab still calls the built-in function. list = which('find', '-all') shows my function as the first entry (for R2017b and R2012b).
It makes sense that Matlab would use the built-in, as that is the function precedence order, but in that case I don't understand why which would think that the local function would take precedence.
Is there a way to do this (preferably without requiring the end-user to jump through many hoops), or should I give up and just use my function under its own name?

  3 Comments

Rik
Rik on 5 Mar 2018
Maybe I shouldn't have posted this on a Saturday. No ideas yet?
John D'Errico
John D'Errico on 5 Mar 2018
Weekends are slow.
Stephen makes good points here. Keeping them separate makes things simpler, and has many advantages. One more advantage is that the built-in find becomes a bit slower when you did just want to use it after all. Now you would have an additional layer of function overhead, tests, etc.
I would also add that the usual solution used, instead of needing a tool that grabs find as a function handle, is to use the builtin function. So at the point where you realize you really wanted to call the default find, just call it as
varargout = builtin('find',varargin{:});
That should grab the old find. What would not surprise me is if you needed to use the rehash command to make sure MATLAB sees your new find tool on the search path. If you don't use rehash, then even though which see your find, the toolbox cache is what matters in terms of what function is actually called.
Now, interestingly, I tested this all out with my own test version of find to see if I could overload find. My version of find just displayed some text to the command line, then used the function builtin to call find.
Assuming I would need to rehash the path, I did that, yet rehashing the cache, even restarting MATLAB, all failed to use my own version, consistent with what Rik observed.
Rik
Rik on 5 Mar 2018
Thank you all for your thoughts. Especially KISS and not letting Matlab crash are good ideas ;)
I would still be interested to know what is the reason that which thinks you can overload find, but actual calls to find still use built-in. Seems an odd discrepancy to me.

Sign in to comment.

Accepted Answer

Stephen Cobeldick
Stephen Cobeldick on 5 Mar 2018
Edited: Stephen Cobeldick on 5 Mar 2018
I think it would be best to use a different name:
  • KISS: don't make this more complex than it needs to be: defining it as its own function name works perfectly. What is wrong with that?
  • makes it clear that the functionality is different (and it is different, therefore it deserves its own name),
  • makes it clear to everyone that any instances use that special functionality and cannot be replaced by the inbuilt,
  • makes it trivial for any future user to search for that function on the interweb and actually find relevant information (even if they don't know what it is),
  • better "branding" for you: distinctive names and effective code will be remembered and associated with you... whereas awkward hacks that don't work properly will also be associated with you.
  • allows the user to use both functions!
  • any undocumented behavior is hard to replicate. We have no way to know what special cases or overloading any compiled function might have and that might be used by TMW in their own code.

  2 Comments

Jos (10584)
Jos (10584) on 5 Mar 2018
I agree fully with Stephen here.
If, in the future, your function errors because The Mathworks decides to change the behaviour of find, this will be very annoying, to say the least ...
Jan
Jan on 5 Mar 2018
What about the discrepancy between the first output of which('find'm, -all) and the selected function? Although I'd avoid replacing built-in functions in any case, which should be able to identify the called function.
I had rewritten and shadowed strcmp successfully in R2009a. I edited the code and inserted a bug, which let the function crash. Afterwards I was not able to open the editor, exit failed and after closing Matlab through the task manager I could not start it anymore. Fortunately all I had to do is to delete the new file to repair Matlab, but I'm much more conservative now with shadowing built-in functions.

Sign in to comment.

More Answers (0)

Sign in to answer this question.