What MATLAB functions are underappreciated?
Show older comments
Open question: What MATLAB function(s) do you wish you had discovered sooner? Are there any functions that no one talks about, but you use every day?
There are certainly some hidden gems that I don't know about, so rather than leaving it to chance that I might find them someday by accident, share 'em now. I'll get things started with a couple of functions that I find particularly useful.
1 Comment
Stephen23
on 22 Apr 2021
I always have the feeling there should be some neat applications for this:
Answers (8)
Chad Greene
on 22 Apr 2021
3 votes
5 Comments
Sean de Wolski
on 22 Apr 2021
This was what I would post but you beat me to it. Accumarray is my individual favorite function in MATLAB. The ability to package outputs of the function in scalar cells allows you to do ANY type of grouping operation on anything.
- Train a different neural network for each group
- Build this 3d array from a stacked table
- Draw a histogram for each group
I even once used nested accumarrays (i.e. an accumarray inside the aggregation function of the first accumarray!). This felt a little uncanny and would certainly take effort to explain or figure out as a reviewer but it turned what would've been a really brutal set of loops into two or three lines of code.
Stephen23
on 22 Apr 2021
@Sean de Wolski: I always thought that the default function should be "putting into scalar cells". Much more useful than SUM.
Sean de Wolski
on 22 Apr 2021
I agree, Stephen. I don't know the development timeline and if accumarray predates cells or not. I think they were going for the same accumulation as sparse().
Steven Lord
on 22 Apr 2021
Cell arrays were introduced in MATLAB 5.0 I think. [That was well before I started working at MathWorks.] The accumarray function is newer than cell arrays. I want to say MATLAB 6.5, but I'm not certain.
Rik
on 22 Apr 2021
accumarray is mentioned in the new features summary of R14SP3 ("The accumarray function now allows more flexibility for input/output classes and functions to be called."), but is missing from R13, so I presume it was added in v7.0.
dbstop . Many newcomers mention, that they do not understand, what their code does. The possibility to step through it line by line after setting a break point is essential for professionals also.
Setting conditional breakpoints in all lines of a function, helps to track, where a variable is changed:
function bruteDBOnCondition(mFile, Cond)
% INPUT:
% mFile: Name of the M-file
% Cond: Char vector containing a condition, e.g. x~=0.
% The debugger stops, if the condition is TRUE.
CStr = strsplit(fileread(mFile), '\n');
[~, mName] = fileparts(mFile);
for k = 1:numel(CStr)
if ~isempty(CStr{k}) && ~startWidth(strtrim(CStr{k}), '%')
dbstop('in', mName, 'at', sprintf('%d', k), 'if', Cond)
end
end
end
Further useful applications:
dbstop if error
dbstop if all error % or: if caught error
4 Comments
Rik
on 23 Apr 2021
I combine this one with another entry on this list with the line below
ans=dbstack;dbstop('in',strrep(mfilename,'.m',''),'at',num2str(ans(1).line+1)),drawnow %#ok<NOANS>
This line will make sure there is a breakpoint in my code, even after clear all (or for cases I do use: after building a function from several parts). Bonus points if you use it inside a conditional block to let it have the effect of a hard-coded conditional breakpoint.
The beauty of this monstrous line is that it works in any release (as far back as ML6.5) and doesn't mess with your variables (unless you're using ans, which you should only do in Cody anyway).
Steven Lord
on 23 Apr 2021
Edited: Steven Lord
on 24 Apr 2021
If you have the ability to modify the code and want to force MATLAB to stop on a particular line (regardless of whether or not clear all has been called) you could add a call to keyboard to that line.
[SL: forgot the ) ]
Rik
on 23 Apr 2021
I should have known there was an easy way to do this. Thanks for the suggestion. This seems to cover all of my use cases, without having to resort to a 100 character line.
Jan
on 24 Apr 2021
It is useful, that clear all does not clear the break points in modern Matlab versions anymore.
1 Comment
Sean de Wolski
on 22 Apr 2021
I like the actual light object. It's actually fairly intuitive "I want to put a green light here" and allows you do cool things like the mathworks logo (>>edit logo)
Sean de Wolski
on 22 Apr 2021
onCleanup - I want to reliably do this thing at the end... I've actually gotten to the point that I will pass these (or cell arrays on them) as return outputs to functions or properties of a class as a means to save something as long as necessary. E.g:
[filename, deleter] = someFunctionThatWritesATempFile(stuff)
filename = tempname+".csv";
writetable(stuff, filename)
deleter = onCleanup(@()delete(filename))
Now if I want the file to be temporary - just call it without an input. If I need that file to exist until I'm done with it (e.g. report gen output or something, keep the deleter around and then it still goes away at the end).
Bjorn Gustavsson
on 22 Apr 2021
0 votes
1 Comment
Steven Lord
on 22 Apr 2021
If you like the factorize File Exchange submission, you may be interested in the decomposition function that has been included in MATLAB for several releases.
Sean de Wolski
on 22 Apr 2021
Edited: Sean de Wolski
on 22 Apr 2021
0 votes
mfilename I use this all of the time for building relative file or folder paths. I want currentProject().RootFolder to replace it as that's generally better but that's not supported in Compiler workflows so mfilename it continues to be.
1 Comment
Jan
on 22 Apr 2021
Yes, this has been useful for projects, which stores data in subfolders of the M files:
myPath = fileparts(mfilename('fullpath'))
Sean de Wolski
on 22 Apr 2021
0 votes
tempname/tempdir - Need to write something and guarantee write permissions on any platform...
1 Comment
Benjamin Großmann
on 28 May 2021
arguments declaration within functions, introduced in 2019b, is very powerful (pythonic? ;-)) for writing generic and reusable functions. Argument validation is great, but I really enjoy the possibility to define (additional) optional name-value argumentsn as well as the functions usage with name-value pairs and the possibitlity to define default values for input arguments.
function someFunction(invars)
arguments
invars.someInt {mustBeInteger} = rand(3);
invars.someText {mustBeText} = inputdlg('Input argument b');
end
% use invars.someInt and invars.someText within the function
% someCode
%
end
Call the function with or without any of the (optional) arguments:
someFunction(someInt=2, sometText='Text');
someFunction(someInt=2);
someFunction(sometText='Text');
someFunction();
Categories
Find more on Matrix Indexing 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!
