- Blocked wait with timeout for asynchronous events
- Speeding-up builtin Matlab functions – part 2
- Speeding-up builtin Matlab functions – part 1
- Spicing up the Matlab Editor
- Auto-scale image colors
- Adding custom properties to GUI objects
- IP address input control
- Customizing axes tick labels
- Customizing histogram plots
- Toolbar button labels
- Using SQLite in Matlab
- PlotEdit context-menu customization
- Builtin PopupPanel widget
- Customizing uifigures part 3
- Customizing contour plots part 2
- Desktop (43)
- Figure window (50)
- Guest bloggers (59)
- GUI (151)
- Handle graphics (81)
- Hidden property (41)
- Icons (7)
- Java (170)
- Listeners (22)
- Memory (16)
- Mex (12)
- Presumed future risk (372)
- Public presentation (6)
- Semi-documented feature (9)
- Semi-documented function (33)
- Stock Matlab function (137)
- Toolbox (9)
- UI controls (50)
- Uncategorized (13)
- Undocumented feature (200)
- Undocumented function (37)
TagsActiveX AppDesigner Callbacks COM Compiler Desktop Donn Shull Editor Figure FindJObj GUI GUIDE Handle graphics HG2 Hidden property HTML Icons Internal component Java JavaFrame JIDE JMI Listener Malcolm Lidierth MCOS Memory Menubar Mex Optical illusion Performance Profiler Pure Matlab schema schema.class schema.prop Semi-documented function Toolbar uicontrol uifigure UIInspect uitable uitools Undocumented feature Undocumented function Undocumented property
- Marshall (17 hours 51 minutes ago): Hi Yair, One of the lines in your code MaxIndex2 = find(MaxDD==DD,1,'last'); is one that is incredibly common but is undoubtedly inefficient because the == compares every element,...
- John (2 days 11 hours ago): Yair, thanks for the quick reply and explanation
- Yair Altman (2 days 12 hours ago): @John – the reason is that MaxIndexes is compared to another indices array, MaxIndex2, below. For this comparison we need numeric indices, not a logical array.
- John (2 days 13 hours ago): Hi Yair just wondering if the find function is really required for example is: MaxIndexes = MaxData==Data; equivalent to MaxIndexes = find(MaxData==Data); best regards
- Peter (7 days 12 hours ago): This looks great but as others have pointed out, the example is incomplete. Could you provide an actual working code as the code snippets you provide does not work by them self?...
- David (11 days 20 hours ago): Hi Yair, Thanks for the quick reply. I will take a look!
- Yair Altman (11 days 20 hours ago): @David – almost all the GUI customizations described in this blog relate only to the legacy (Java-based) figures. AppDesigner-created figures (so-called...
- David (11 days 20 hours ago): Is there anyway to get this to work with app designer? I can’t seem to find any java objects in app designer and I am not sure if there is a way that I just don’t know...
- Yair Altman (12 days 0 hours ago): @Sina – you need to access the individual contour lines, and then change the lines’ ColorType from ‘truecolor’ to ‘truecoloralpha’, as I...
- Yoni (12 days 14 hours ago): Hi- I am wondering if anyone else has trouble saving lines made with a color gradient? Specifically, I am trying to save a vector format (pdf, eps, or similar) with h2b-style...
- Yair Altman (14 days 2 hours ago): Mohammad – read the post carefully: I explained near the bottom how you can get the handle and set callbacks to get the user-selected date.
- Mohammad (16 days 0 hours ago): Dear Yair I have inserted Date selection components into my MATLAB GUI but I do know how I can make a handle for the Date selection components in order to update the date which is...
- Gregor Lehmiller (17 days 13 hours ago): Unfortunately, while it has added many features, the Matlab stats/machine-learning toolbox has been going backwards for a number of versions. In particular, the obsession...
- Michelle Hirsch (18 days 19 hours ago): Thanks for this post, Yair. I’ve passed along the issues to the development team.
- Yair Altman (18 days 22 hours ago): @Ann – the best way to delete the object is via its Matlab container panel, which is accessible as the 2nd output of javacomponent: [jRangeSlider, hContainer] =...
MathWorks invests a huge amount of effort in recent years on supporting large distributed databases. The business case for this focus is entirely understandable, but many Matlab users have much simpler needs, which are often served by the light-weight open-source SQLite database (which claims to be the most widely-used database worldwide). Although SQLite is very widely used, and despite the fact that built-in support for SQLite is included in Matlab (for its internal use), MathWorks has chosen not to expose any functionality or wrapper function that would enable end-users to access it. In any case, I recently came across a need to do just that, when a consulting client asked me to create an interactive data-browser for their SQLite database that would integrate with their Matlab program:
In today’s post I will discuss several possible mechanisms to integrate SQLite in Matlab code, and you can take your pick among them. Except for the Database Toolbox, all the alternatives are free (open-source) libraries (even the commercial Database Toolbox relies on one of the open-source libraries, by the way).
Last week, a Matlab user asked whether it is possible to customize the context (right-click) menu that is presented in plot-edit mode. This menu is displayed by clicking the plot-edit (arrow) icon on the standard Matlab figure toolbar, then right-clicking any graphic/GUI element in the figure. Unfortunately, it seems that this context menu is only created the first time that a user right-clicks in plot-edit mode – it is not accessible before then, and so it seems impossible to customize the menu before it is presented to the user the first time.
A few workarounds were suggested to the original poster and you are most welcome to review them. There is also some discussion about the technical reasons that none of the “standard” ways of finding and modifying menu items fail in this case.
In today’s post I wish to repost my solution, in the hope that it might help other users in similar cases.
My solution is basically this:
8 years ago I blogged about Matlab’s builtin HelpPopup widget. This control is used by Matlab to display popup-windows with help documentation, but can also be used by users to display custom lightweight popups that contain HTML-capable text and even URLs of entire webpages. Today I’d like to highlight another builtin Matlab widget,
ctrluis.PopupPanel, which can be used to display rich contents in a lightweight popup box attached to a specific Matlab figure:
As you can see, this popup-panel displays richly-formatted contents, having either an opaque or transparent background, with vertical scrollbars being applied automatically. The popup pane is not limited to displaying text messages – in fact, it can display any Java GUI container (e.g. a settings panel). This popup-panel is similar in concept to the HelpPopup widget, and yet much more powerful in several aspects.
Customization hacks reported on this blog last year (part 1, part 2) may fail in some cases due to the changing nature of the undocumented internals. Some examples are the way by which we can extract the uifigure’s URL (which changed in R2017a), the ability to display and debug uifigures in a standard webbrowser with associated dev tools (which seems to have stopped working in R2017b), and the way by which we can extract the Dijit reference of displayed uicontrols.
Greatly assisting in this respect is Iliya Romm, who was the guest blogger for part 2 of this series last year. Iliya co-authored the open-source (GitHub) mlapptools toolbox, which enables accessing and customizing uifigure components using standard CSS, without users having to bother about the ugly hacks discussed in the previous parts of the series. This toolbox is really just a single Matlab class (
mlapptools), contained within a single m-file (mlapptools.m). In addition to this class, the toolbox includes a README.md mark-down usage documentation, and two demo functions, DOMdemoGUI.m and TableDemo.m.
Here is the effect of using TableDemo, that shows how we can customize individual uitable cells (each uitable cell is a separate Dijit widget that can be customized individually):
A few weeks ago a user posted a question on Matlab’s Answers forum, asking whether it is possible to display contour labels in the same color as their corresponding contour lines. In today’s post I’ll provide some insight that may assist users with similar customizations in other plot types.
Matlab does not provide, for reasons that escape my limited understanding, documented access to the contour plot’s component primitives, namely its contour lines, labels and patch faces. Luckily however, these handles are accessible (in HG2, i.e. R2014b onward) via undocumented hidden properties aptly named EdgePrims, TextPrims and FacePrims, as I explained in a previous post about contour plots customization, two years ago.
Let’s start with a simple contour plot of the peaks function:
[X,Y,Z] = peaks; [C,hContour] = contour(X,Y,Z, 'ShowText','on', 'LevelStep',1);
The result is the screenshot on the left:
In order to update the label colors (to get the screenshot on the right), we create a short
updateContours function that updates the TextPrims color to their corresponding EdgePrims color:
Back in 2010, I posted about Matlab’s undocumented feature function. One of the features that I mentioned was
'HotLinks'. A few days ago I had an occasion to remember this feature when a StackOverflow user complained that the headers of table outputs in the Matlab console appear with HTML tags (<strong>) in his diary output. He asked whether it was possible to turn off this automated headers markup.
There are several ways this problem can be solved, ranging from creating a custom table display function, to modifying the table’s internal disp method (%matlabroot%/toolbox/matlab/datatypes/@tabular/disp.m), to using this method’s second optional argument (
disp(myTable,false)). Note that simply subclassing the
table class to overload disp() will not work because the
table class is Sealed, but we could instead subclass
table‘s superclass (
tabular) just like
Inside the disp.m method mentioned above, the headers markup is controlled (around line 45, depending on your Matlab release) by
matlab.internal.display.isHot. Unfortunately, there is no corresponding setHot() method, nor corresponding m- or p-code that can be inspected. But the term “Hot” rang a bell, and then I remembered my old post about the HotLinks feature, which is apparently reflected by
feature('HotLinks',false); % temporarily disable bold headers and hyperlinks (matlab.internal.display.isHot=false) disp(myTable) myTable % this calls disp() implicitly feature('HotLinks',true); % restore the standard behavior (markup displayed, matlab.internal.display.isHot=true)
Searching for “isHot” or “HotLinks” under the Matlab installation folder, we find that this feature is used in hundreds of places (the exact number depends on your installed toolboxes). The general use appears to be to disable/enable output of hyperlinks to the Matlab console, such as when you display a Matlab class, when its class name is hyperlinked and so is the “Show all properties” message at the bottom. But in certain cases, such as for the
table output above, the feature is also used to determine other types of markup (bold headers in this case).
I’m proud to report that MathWorks has recently posted my article “Tips for Accelerating MATLAB Performance” in their latest newsletter digest (September 2017). This article is an updated and expanded version of my post about consulting work that I did for the Crustal Dynamics Research Group at Harvard University, where I helped speed-up a complex Matlab-based GUI by a factor of 50-500 (depending on the specific feature). You can read the full detailed technical article here.
Matlab’s builtin functions for exporting (saving) data to output files are quite sub-optimal (as in slowwwwww…). I wrote a few posts about this in the past (how to improve fwrite performance, and save performance). Today I extend the series by showing how we can improve the performance of delimited text output, for example comma-separated (CSV) or tab-separated (TSV/TXT) files.
The basic problem is that Matlab’s dlmwrite function, which can either be used directly, or via the csvwrite function which calls it internally, is extremely inefficient: It processes each input data value separately, in a non-vectorized loop. In the general (completely non-vectorized) case, each data value is separately converted into a string, and is separately sent to disk (using fprintf). In the specific case of real data values with simple delimiters and formatting, row values are vectorized, but in any case the rows are processed in a non-vectorized loop: A newline character is separately exported at the end of each row, using a separate fprintf call, and this has the effect of flushing the I/O to disk each and every row separately, which is of course disastrous for performance. The output file is indeed originally opened in buffered mode (as I explained in my fprintf performance post), but this only helps for outputs done within the row – the newline output at the end of each row forces an I/O flush regardless of how the file was opened. In general, when you read the short source-code of dlmwrite.m you’ll get the distinct feeling that it was written for correctness and maintainability, and some focus on performance (e.g., the vectorization edge-case). But much more could be done for performance it would seem.
This is where Alex Nazarovsky comes to the rescue.
I regularly follow the MathWorks Pick-of-the-Week (POTW) blog. In a recent post, Jiro Doke highlighted Per Isakson’s tracer4m utility. Per is an accomplished Matlab programmer, who has a solid reputation in the Matlab user community for many years. His utility uses temporary conditional breakpoints to enable users to trace calls to their Matlab functions and class methods. This uses a little-known trick that I wish to highlight in this post.
Matlab breakpoints are documented and supported functionality, and yet their documented use is typically focused at interactive programming in the Matlab editor, or as interactive commands that are entered in the Matlab console using the set of db* functions: dbstop, dbclear, dbstatus, dbstack etc. However, nothing prevents us from using these db* functions directly within our code.
I have prepared the following online webinars on advanced Matlab topics I (click the webinar titles for a detailed description):
- Interactive Matlab GUI (3:26 hours) – $245 (buy)
- Advanced Matlab GUI (3:37 hours) – $245 (buy)
- Expert Matlab GUI (3:33 hours) – $245 (buy)
==> or buy all 3 Matlab GUI webinars for only $595 (buy)
- Matlab performance tuning part 1 (3:39 hours) – $245 (buy)
- Matlab performance tuning part 2 (3:43 hours) – $245 (buy)
==> or buy both Matlab performance tuning webinars for only $395 (buy)
- Object-oriented Matlab programming (3:36 hours) – $245 (buy)
- ==> or buy all 6 Matlab webinars (GUI, performance & OOP) for only $995 (buy)
All webinars are highly technical, concise and to the point, making very effective use of your time. They are based on onsite training courses that I presented at multiple client locations (details).
These webinars could be a great way for you to improve your Matlab proficiency and efficiency. You will quickly learn how to produce higher quality, better looking, faster working, and more robust applications. Your effectiveness in writing Matlab programs will improve, saving you development time while improving the quality. And all this at the comfort and convenience of your office or home.
Email me if you would like additional information or a group discount, or to inquire regarding an onsite training course, or for any other related query/suggestion.