MATLAB Answers

What is missing from MATLAB #2 - the next decade edition

102 views (last 30 days)
Rik on 31 Jul 2020
Commented: Walter Roberson on 5 Oct 2021 at 17:52
Meta threads have a tendency to grow large. This has happened several times before (the wishlist threads #1 #2 #3 #4 #5, and 'What frustrates you about MATLAB?' #1 and #2).
No wonder that a thread from early 2011 has also kept growing. After just under a decade there are (at time of writing) 119 answers, making the page slow to load and navigate (especially on mobile). So after a friendly nudge; here is a new thread for the things that are missing from Matlab.
Same question: are there things you think should be possible in Matlab, but aren't? What things are possible with software packages similar to Matlab that Matlab would benefit from? (note that you can also submit an enhancement request through support, although I suspect they will be monitoring activity on this thread as well)
What should you post where?
Wishlist threads (#1 #2 #3 #4 #5): bugs and feature requests for Matlab Answers
Frustation threads (#1 #2): frustations about usage and capabilities of Matlab itself
Missing feature threads (#1 #2): features that you whish Matlab would have had
@anyone posting a new thread when the last one gets too large (about 50 answers seems a reasonable limit per thread), please update this list in all last threads. (if you don't have editing privileges, just post a comment asking someone to do the edit)

Answers (26)

cui on 7 Feb 2021
Edited: per isakson on 31 May 2021
Deep Learning toolbox:
How to visualize the changes in dlarray/weight distribution with histograms in deep learning?
Histogram displays how the trend of tensor (weight, bias, gradient, etc.) changes during the training process in the form of histogram. Developers can adjust the model structures accurately by having an in-depth understanding of the effect of each layer.
cui on 9 Feb 2021
@Adam Danz Thank you for your suggestions, I look forward to the official future version will be greatly improved!

Sign in to comment.

cui on 7 Feb 2021
Edited: cui on 1 Apr 2021
Deep Learning toolbox:
and so on....
The above are influential applications of deep learning in various aspects, but it is difficult to reproduce in matlab. Although Matlab2019b version supports automatic differentiation mechanism, it is still difficult to implement algorithms in matlab. The efficiency of the differentiation mechanism is not high, and many operators do not support it. I tried to implement the more famous yolov3/v4 algorithm with the latest MATLAB2020a version, but it is still not satisfactory
In summary, my personal suggestions are like my personal answer above, and I hope that future versions can improve a lot!
  1 Comment
cui on 24 Sep 2021 at 2:02
I have been following the latest development progress of "deeplearning toolbox", and although there are many new features listed, most of them are superficial improvements with very limited substantive support for the "operator", which is still very inadequate for experienced and in-depth researchers.
I hope that mathworks will seriously develop basic modules for the toolbox, instead of small features that are not very important to attract beginners.
我一直在关注“deeplearning toolbox”的最新开发进展,虽然有很多新的功能项被列出来,但这些大部分都是表面上改进,实质上的支持operator非常有限,对于有经验的深入研究者来说还显现的非常不足。

Sign in to comment.

Rafael S.T. Vieira
Rafael S.T. Vieira on 31 Jul 2020
Edited: Rafael S.T. Vieira on 31 Jul 2020
I would love to have a command TeX2sym and sym2TeX. With it, we could bring formulas from LaTeX and run them in MATLAB and the other way around. It is a tedious work doing it by hand, and I could bet most MATLAB users do it or will do it eventually.
Another useful feature to add would be arbitrary-precision arithmetic...languages such as python and Java (with Bignum), allows unlimited precision when dealing with integers at least. Granted that It is slow, but I believe that the MATLAB team could do something better. And I honestly feel like MATLAB is missing a feature by not having it...even some competing software has it.
And finally I was considering buying the Text Analytics Toolbox, and it would be nice, if it could have a grammar/spell checker. Even if it is not as advanced or doesn't contain all words. With live scripts, we can write an interactive document, so it would be nice if MATLAB could correct our spelling (even if it required a ToolBox to do it).
Rafael S.T. Vieira
Rafael S.T. Vieira on 1 Aug 2020
Thank you for your interest, Walter and Rik. I believe that It is best to teach ourselves to code in a particular way, which will allow MATLAB to convert it to sym, than to be doing the task by hand every time.
Operator precedence could take care some of these issues. If \sin x + y was the input, then left-to-right precedence could dictate the output to be sin(x) + y. And to obtain sin(x+y), we would have to code in LaTeX \sin{x+y} or \sin(x+y).
Implied multiplication is indeed very common in mathematics and latex. On the other hand, it is also almost ubiquitous that variables are written just as single letters (especially if we are writing implied multiplication).
Finally, a command like tex2sym does not need to contemplate every math package imho, just some set of commands and macros. MATLAB could even return its best guess, and let us do the remainder of the task. Of course, ideally, we would just copy the contents from environments like $$ and \[ ... \] and paste them into MATLAB for a tex2sym conversion.

Sign in to comment.

dpb on 10 Sep 2020
Editor won't restrict a substituion to selected it knows of is the function. Uncool in the max! I'm now having to fix up a bunch of stuff shouldn't have to have done... :(

Shae Morgan
Shae Morgan on 31 Jul 2020
facet_wrap or facet_grid (or general ggplot2 functionality) version of subplots, or some altered, simpler customizability for subplotting subsets of data.
gramm is an available toolbox, but it'd be nice to have it built in

Seth Wagenman
Seth Wagenman on 31 Aug 2020
Ability to convert Python items to MATLAB data types (other than numpy arrays) inside of MATLAB, rather than inside of Python using the admin-rights-required API:

Walter Roberson
Walter Roberson on 13 Sep 2020
A "soft interrupt" -- that is, an interrupt that can be handled with try/catch .
For example I am running a long calculation at the moment that iterates several times, and each iteration can take more than an hour. I don't always have the patience to wait through as many iterations as I asked for. For my purposes, the output of the last successful iteration would be "good enough" if I were to ask to interrupt the function.
I can control-C, but that interrupts the function completely, losing all of the outputs, and losing the function variables.
If I could somehow "soft interrupt" and have it return the current values of all variables, then that would be good enough for my current task. But the generalization of that would be the ability to catch a soft interrupt in a try/catch so that the code could make whatever final summariziation it needed to in order to create usable output variables. Furthermore, even though my own routine might be happy to return the "last good" values of the output variables, any soft-interrupt I requested might well get received while some lower-level routine had control that did not know about soft-interrupts, so I would want interrupt (with no return values) to apply to those layers until control reached my handler for a clean run-down.
Sindar on 3 Oct 2020
My solution in a similar case was to check whether a certain file ('FAIL_MODE.txt') exists in the directory at the end of each iteration. If it does, break the loop. Then, to stop the program, all I had to do was create the file (which is pretty trivial unless Matlab has frozen the whole computer)

Sign in to comment.

Tim on 5 Nov 2020
The following changes to the internal volume renderer would make Matlab much more useful for volume visualization:
  • True RGB volume visualization (vs. just scalar data + colormap)
  • Independent, decoupled specification of alpha values and intensity values
  • The ability to combine volume images with standard axes and axes objects like points, lines, patches, etc.

Mario Malic
Mario Malic on 13 Nov 2020
When typing code, if user wants to reference a variable or a function, one could click tab and get a matching list of functions and variables. Would it be useful to split this functionality with modifier if user wants to reference one of the two? As an example Shift +Tab for variables and Tab for functions and variables (not to break the current functionality).

cui on 7 Feb 2021
Edited: cui on 8 Feb 2021
I very much hope that the official version will strengthen the readstruct function in the future! Lack of complete uniformity to support more format requirements.

Camilo Andres Manrique Escobar
One thing would be: defining classes in notebooks (Live Scripts in MATLAB case). That's a normal thing for years now in Python, for example.

Mikhail on 2 Aug 2020
Some (well, most) dynamic programming languages allow for an experienced developer to have an insight look into how their code is actually executed by the runtime environment.
They are able to see the parse tree and the compiled byte code.
They are able to see what parts of code are JIT-compiled, and how exactly the are compiled. When something is not compiled, they are able to see why.
The developer doesn't have to guess whether a particular optimization has kicked in or not. They know for sure how each and every object in their code is handled (whether it is CoW, passed by reference, passed by value).
I'd love to see these capabilities in MATLAB, too.
Rik on 2 Aug 2020
That doesn't make the function horrible, it just means the function is not suited to your needs. I don't complain that my hypothetical electric stove can't cool things down, even though with a TEC it is possible to both heat and cool down things with a single electrically powered device.
Although you could re-use a lot of the internals of readfile to fix double UTF-8 encoded files, the problem is not the function, it's the double encoding. Fixing double encoding is a different task from reading a file correctly. It wouldn't be a matter of 'mending my function', it would be re-using internal functions for a different goal. The word 'mending' implies my function is broken, but returning a double encoded file in a corrected form is not living up to the contract that the name of the function is offering.
Also, there are more reasons to close down the source than just thinking your users are dumb (suggesting otherwise sounds a lot like assuming bad faith). As an example: if you want to provide a function for a license fee, it would be plain stupid to have your license check in an m-file, since it would be almost trivial to circumvent.

Sign in to comment.

dpb on 6 Sep 2020
Edited: dpb on 6 Sep 2020
A ready-built insertion method for tables, arrays, etc., so don't have to do all the under-the-hood indexing manually...given an array of the right size and matching index, if had table (say), then
ideally, an option with keyword 'Empty', T|F would be available as well.
Maybe I'm missing some magic pixie dust, but I've been unable to figure out a way to this without physically moving a section at a time to insert the new row which means working from rear to front to avoid changing the indices to the insertion points or by catenating the pieces starting from the front.
dpb on 6 Sep 2020
Yeah, that's undoubtedly a better way on the construction, Walter -- I hadn't really thought about the implementation too much other than going "dead ahead" to "just get 'er done!" for the immediate task at hand.
Taking a break, I thought I'd throw it out as an idea for an enhancement for discussion...with the sidelight maybe somebody did have a "trick" hadn't thought of.

Sign in to comment.

Walter Roberson
Walter Roberson on 9 Sep 2020
I know I've said it before, but it's still missing and still important:
We need a way to gather all of the outputs of function call into a cell in the middle of an expression .
I know this may be tricky to implement internally. There are internal rules that are hard to work out, that have to do with how many outputs to request from functions. For example,
[A, B] = cellfun(@C, D, 'uniform', 0)
somehow passes knowledge of "two outputs" to C -- for example if you were to use @max then A would be a cell array of the maxima and B would be a cell array of the indices. The situation can get more complicated than this, and figuring out all the cases can make your head hurt. But we do know that any expression C(D(E)) that D(E) will be evaluated asking for exactly one output and that would be passed into C... but the knowledge of multiple outputs would be passed to C and yet not D.
The number of outputs to use is not inherently clear. If for example you call ode45 and ask to gather the outputs, are you asking for the common TOUT, YOUT case, or the full TOUT,YOUT,TE,YE,IE ? There are some cases where extra outputs can be expensive to calculate, so even though an operation that gathered "maximum" outputs might be useful, it is not always desireable, so ability to select the number would be useful.
Then there are issues with, for example, deal(), where you can have any number of outputs with just a single input:
[A,B,C,D] = deal(123)
would initialize A, B, C, and D all to 123. So if you ask to gather "all" of the outputs from deal(123), that number is not well defined.
Working these things out is not trivial -- but it is a really missing bit of the language.
There might be an opportunity for a syntax such as {}name -- e.g.,
arrayfun(@(X0) {}ode45(@f, tspan, X0), x0s)
meaning to gather all of the outputs of the call. At present, {} is not valid before a name.
Walter Roberson
Walter Roberson on 10 Sep 2020
Imagine that you want to implement
[temp{1:3}] = ndgrid(-1:.1:1);
C = cell2mat(cellfun(@(M) M(:), temp, 'uniform', 0);
That is, you want a single array in which each of the columns is one of the outputs of ndgrid(). And you want to do it as a single expression.
ndgrid() does not have a fixed number of outputs -- it is not like sin() with one fixed outputs, or max with two fixed outputs. nargout(@ndgrid) is -1 -- in other words the declaration is like
function varargout = ndgrid(varargin)
If you wanted to capture all of the outputs of max() then you could query ndgrid(@max) to get 2:
function outputs = gather_outputs(f, varargin)
n = nargout(f);
[outputs{1:n}] = f(varargin{:});
and you could
gather_outputs(@max, rand(3,5))
and this would be fine for gathering the two outputs of max into a single cell array.
But if we try to
gather_outputs(@deal, [])
then nargout(@deal) is -1 and if we said "Okay, take the absolute value of that -1" then we would be doing
[outputs{1:1}] = deal([])
which would give you just {[]} as the output.
This shows that you cannot just look at nargout() of the function you are invoking, such as @max or @deal .
Can we just look at nargout of the overall expression to determine the number of outputs to use for deal? No,
C = cell2mat(cellfun(@(M) M(:), gather_outputs(@ndgrid, -1:.1:1), 'uniform', 0));
would at best tell you that nargout is 1 (the C variable). You need something else to tell you the number of outputs you want to get -- something like
function outputs = gather_n_outputs(f, n, varargin)
[outputs{1:n}] = f(varargin{:});
and then you could
C = cell2mat(cellfun(@(M) M(:), gather_n_outputs(@ndgrid, 3, -1:.1:1), 'uniform', 0));
The request is to build this kind of facility in to MATLAB instead of having to write true functions like gather_n_outputs and have to pass function handles into them. Some syntax like
C = cell2mat(cellfun(@(M) M(:), {3}ndgrid(-1:.1:1), 'uniform',0));
where the hypothethical new syntax {3} indicates that you are requesting 3 outputs and that you want them gathered in a cell array. A common alternate syntax would be {} to request all of the outputs, like
C = cellfun(@(V) V.^2, {}max(rand(3,5)), 'uniform', 0)
which would hypothetically gather both (all) outputs of the max() call into a cell array that would then be available for further processing.
If you just used
C = cellfun(@(V) V.^2, max(rand(3,5)), 'uniform', 0)
then the knowledge of the single output would be carried through into the cellfun, which would tell max() to only emit a single output, so you would not get the second output processed. And the first output would be numeric not cell, so you would need arrayfun instead of cellfun...)

Sign in to comment.

Walter Roberson
Walter Roberson on 12 Oct 2020
A "select" clause for readtable() and kin.
For example one user only wanted to read the rows in which one particular variable had a particular value
It could at some point be implemented in terms of a rowfun() type function that got passed the variables for a row and could make arbitrary decisions based upon the row contents.
However an earlier stage could potentially have pairs of variable names (or numbers) and a vector or cell array of values, in which the selection code did an ismember(). Such a facility could be further improved if there were a "sorted" option (so the code could figure out when to give up looking -- any one value should no longer be looked for if a larger value were encountered). Or even "grouped", which would not imply sorted as such but would imply that when you find a value that all the instances of that value that exist will be in adjacent rows and so as soon as you detect a change you can know to give up looking for that value.

Sindar on 5 Nov 2020
Ok, this is pretty minor, but:
For common functions that return values as the first output and indices as the second, it would be nice if there was a direct way of getting the indices, so I could do things like this:
x = [1 2 5 4 5];
y = 1:5;
y_xsorted = y(sortInd(x));
% or
y_xunique = y(unique(x,'ia'));
instead of needing to create temporary variables:
x = [1 2 5 4 3];
y = 1:5;
[~,idx] = sort(x);
y_xsorted = y(idx);
[~,idx] = unique(x);
y_xunique = y(idx);
I know I could make wrappers myself, but this seems like a case where a builtin function could potentially be noticeably optimized. (And, is more straightforward than rebuilding the whole output system)

Bruno Luong
Bruno Luong on 6 Nov 2020
Implement family of (numerical) data structure with O(1) inserttion, removal, that includes chain-list, binary tree, Fibonachi tree, red-black tree etc, etc, ... the performance must be focus point. Don't care if they are encapsulated or not in the OP, just don't make that reduce the performace.

Bruno Luong
Bruno Luong on 6 Nov 2020
Implement equivalent to C inline-function (or macro) so as calling this function on small data won't be penalized in speed with the over-head.

Bruno Luong
Bruno Luong on 17 Nov 2020
Edited: Bruno Luong on 17 Nov 2020
No big deal but I wish SIGN(X) function could return 1 for X=0 instead of 0. May be implementing an option to not break the compatibility.
I just rarely use SIGN because of this exception choice.
Bruno Luong
Bruno Luong on 18 Nov 2020
Why I prefer sign(0) = 1?
To me y = sign(x) should satisfy these two important properties
norm(y) = 1
x = y * abs(x)
This uniquely determines y for any x ~= 0 (real, complex or even quaternion). For x=0, any y=exp(1i*alpha) with alpha real meet both properties, so just select it as y=1 for arbitrary convention.
However the MATLAB SIGN() function does NOT satisfy the first property for x=0.
Adams's trick sign(x+realmin) is interesting, but it just shift the issue to x=-realmin.

Sign in to comment.

cui on 19 Feb 2021
Deep Learning toolbox:
groupedConvolution2dLayer since R2019a support, but groupedConvolution3dLayer don't support ??? (until R2020b)
Adam Danz
Adam Danz on 23 Feb 2021
@cui could you elaborate on your last comment? How did you contact MathWorks and why do you have that impression of them?

Sign in to comment.

Robert Guldi
Robert Guldi on 29 May 2021
As far as I can tell, there does not seem to be very much in the ways of documentation for Excel-based work (i.e creating and manipulating charts). I'd love to see some of this material added into the Documentation search if at all possible.
dpb on 2 Jun 2021
OK, thanks for the hint -- I had thought that
borders=get(theCell, 'Borders');
theBorder=get(borders, 'Item', border);
set(theBorder,'LineStyle', style,'Weight',weight);
would have returned the wanted border Item object, but apparently not...I still don't fully understand that, but the following does work....
set(theBorder,'LineStyle', style,'Weight',weight);
although one apparently can't write
set(borders.Item(whichBorder),'LineStyle', style,'Weight',weight);
in typical MATLAB syntax fashion.
function SetBorder(sheetReference, ranges, whichBorder, weight, style)
if style==XlLineStyle.xlDouble, weight=XlBorderWeight.xlThick; end % only combination that works
if ischar(ranges), ranges=cellstr(ranges); end
if isenum(whichBorder), whichBorder=int32(whichBorder); end
if isenum(weight), weight=int32(weight); end
if isenum(style), style=int32(style); end
for i=1:numel(ranges)
borders=get(range, 'Borders');
set(theBorder,'LineStyle', style,'Weight',weight);
catch ME
fprintf('Error in function SetBorder.\nError Message:\n%s\n', ME.message)
%warning('Error in function SetBorder.\n%s', ME.message)
Experimentation also revealed that one can't use any combination of the enumerations (which limitation is also NOT documented). Only with the "Thick" weight is a double-line rendered; all the others are a single line of medium weight.
All kinds of things aren't documented and left for only trial and error to uncover...
The above could be cleaned up and forget about trying to use enumerations, but it's expedient for the moment and there are far more important issues to fix rather than continuing to throw time down the rat hole...
Thanks, you did get me pointed to what can be made to work--muchly appreciated!!

Sign in to comment.

cui on 10 Jun 2021
Edited: cui on 13 Aug 2021
Single and multi-objective vision tracking algorithms:
KCF, GOTURN, FairMOT, deepSort ,... are some of the best and successful algorithms in recent years, but unfortunately, why is there no such implementation in the "sensor fusion and tracking toolbox", "deeplearning toolbox" and "computer vision toolbox"?
loss functions for time series prediction:
The current deep learning toolbox is missing loss functions for time series prediction, e.g. "DTW, Soft-DTW, DILATE" loss, and although the signal processing toolbox has a dtw function, it does not support dlarray type data input?
Video reading and processing
The latest version of R2021a only supports fileDatastore/videoReader etc. to load various video datasets, and the read IO bottleneck is very inefficient and lacks a decord-like library for efficient video processing
Bayesian Deep Learning Convolution Network(BDL),Bayesian Neural Network(BNN)
Binary Neural Networks
Does current matlab 2021a deeplearning toolbox support Binary Deep Neural Networks (BNN)? How is it trained and compressed? If not, will future versions integrate this feature? thanks
cui on 18 Aug 2021
@Adam Danz,Thank you for your useful advice!This is another indication that matlab is very good, not the latest, but the most robust and reliable algorithm integration!

Sign in to comment.

Image Analyst
Image Analyst on 29 Jul 2021
I'd like questdlg() to be able to take more than 3 buttons.
Often I need 4 buttons, like "Yes", "No", "Cancel", and "All", like if I'm looping over files in a listbox asking if you want to delete them or not. Why can't questdlg() take any number of arguments, much like other functions like ones(), and just put up the buttons in a dialog box in an array? The last argument could be the button that you'd like for the default (as it is now).
I know I can still use menu() but it's deprecated in favor of listdlg() and I'd rather have buttons than a listbox - it's just more intuitive.

Walter Roberson
Walter Roberson on 10 Aug 2021
Currently evalin() accepts a context argument (such as 'caller' or 'base' or symengine()), and a character vector that is the command to be executed.
This runs into the same horrors as using eval() .
It is difficult to convince people to give up using eval(); they tend to think that their particular use case makes it necessary (it rarely is!). And the cause is Not Helped At All when we have to say "well, it is true that the closely-related "evalin() is needed sometimes"
It would therefore help if there was a way to do something like evalin() but with a function handle. For example,
evalin('caller', 'whos')
might become something like
evalfcnin('caller', @whos)
To be honest, I do not know how this would work in practice, considering that functions need their own workspace to execute in. Maybe some of the technology behind shared variables and nested functions could be used, so that the function could have read/write access to the designated function workspace and yet still be able to have its own private variables.
Sometimes I want to be able to get a look at persistent variables in a function that is not the caller; I have never found a hint that is possible. But the existence of persistent variables that go away when you "clear" the function, implies that each parsed function already has some kind of workspace associated with it. And sometimes it seems to me that it would be useful if you were able to get a referene to that workspace and tell a function to execute using that workspace. Something that might look like
evalinWorkSpace( matlab.workspace.getinstance.caller, @whos)
Having workspaces as accessible objects leads to some interesting possibilities about saving and restoring state, such as for the purpose of recovering from power failures; it also heads towards possibilities such as co-routines.

Valeri Aronov
Valeri Aronov on 31 Aug 2021
Your TypicalX option for fminunc() (and others?) should be extended beyond usage for gradient evaluation only.
I have used normalized variables for optimization for a long time. By default, I do start with [1,1,...,1] as you do, but for gradient evaluation only. There are many areas where a spread of variables is vast (radiolectronics: kiloohms to nanofarads).

Iuliu Ardelean
Iuliu Ardelean on 5 Oct 2021 at 11:17
Edited: Iuliu Ardelean on 5 Oct 2021 at 11:17
I would like imagesc(C) to work with 3 dimensional arrays.
Walter Roberson
Walter Roberson on 5 Oct 2021 at 17:52
vol 3d v2 in File Exchange.
See also the code I posted in about a month ago, which creates voxel cubes (taking care that each one has proper face orientation so normals can be calculated).
The disadvantage of the code I posted is that it builds a cube for each voxel, instead of trying to merge together adjacent voxels to reduce the drawing cost. Drawing one cube for each voxel has advantages if you want to be able to use per-voxel alphadata (since two adjacent cubes with exactly the same "value" attribute might potentially be assigned different alpha.
The code I posted there only draws cubes for "occupied" voxels. Which reduces drawing costs, but leads to questions about the best way to create alpha data -- do you create the alpha data as a cuboid that occupies the full possible space, or do you create the alpha data in a way that maps only to the occupied locations?

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!