- Customizing contour plots part 2
- The HotLinks feature
- Tips for accelerating Matlab performance
- Faster csvwrite/dlmwrite
- Runtime code instrumentation
- Advanced Matlab online webinars
- Matlab GUI training seminars – Zurich, 29-30 August 2017
- Sending HTML emails from Matlab
- User-defined tab completions – take 2
- Matlab Expo – Bern, 22 June 2017
- Matlab compilation quirks – take 2
- GUI formatting using HTML
- MathWorks-solicited Java survey
- I am hiring experienced Matlab programmers (Tel Aviv)
- Additional license data
- Desktop (42)
- Figure window (46)
- Guest bloggers (59)
- GUI (145)
- Handle graphics (76)
- Hidden property (41)
- Icons (7)
- Java (162)
- Listeners (20)
- Memory (15)
- Mex (12)
- Presumed future risk (358)
- Public presentation (6)
- Semi-documented feature (9)
- Semi-documented function (33)
- Stock Matlab function (133)
- Toolbox (7)
- UI controls (48)
- Uncategorized (13)
- Undocumented feature (190)
- 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 scribe Semi-documented function Toolbar uicontrol UIInspect uitable uitools Undocumented feature Undocumented function Undocumented property
- Yair Altman (1 day 22 hours ago): @Claudio – I don’t know why you posted this question here – it seems to relate to popup/dropdown menus and not listboxes. In any case, such menu items cannot...
- claudio (2 days 21 hours ago): Hi Yair how can I change background color for jmenu described in the previous example? I try menuCheck = javax.swing.JMenuItem('Check recording'); bgcolor = get(gcf,'Color'); %...
- Yair Altman (4 days 16 hours ago): Unlike contour, the contourf function returns a list of levels that includes the minimum value, which does not correspond to any contour line ([-6.5466,-6,-5,-4,...] rather than...
- Elbio (5 days 18 hours ago): Hi Yair: Many thanks for your helpful answer. I found a problem though when using contourf. [c,h] = contourf(peaks,'LevelStep',1); drawnow levels = h.LevelList; lines = h.EdgePrims;...
- Yair Altman (6 days 0 hours ago): @Elbio – in HG2 (R2014b or newer) the contour lines (hContour.EdgePrims) correspond to the contour levels (hContour.LevelList). For example, to make all negative contour...
- Elbio (6 days 10 hours ago): Hi Yair: Using the old matlab utilities it was possible to get the Cdata value associated with each line in the contour plot: [c,h]=contourf(peaks,[-9:1:9]) ; h1=get(h,'children');...
- Viktor Horvath (6 days 14 hours ago): Your comment was very helpful, thank you! I would like to add to it, because to me it was not obvious that in the case of Class methods the first argument must be declared in...
- Yair Altman (6 days 17 hours ago): @Daniele – I will answer you in an offline email
- Daniele F. (6 days 17 hours ago): Dear Yair I’m happily using your treeTable utility, thanks again to making it available. I’ve a question: I’ve compiled an application that uses the treeTable...
- Joshua (9 days 5 hours ago): Hi, is there a way to simulate the keyboard input using the robot when the robot encounters user input request generated? For example, a = input('Type a word: ', 's'); This is for...
- matlabi (9 days 9 hours ago): hi Smtp settings Where should we place?
- Yair Altman (9 days 18 hours ago): @Ben – I am not aware of any way to set multi-line text in the BusyAffordance object
- BenBen (9 days 18 hours ago): Is there a way to get multiple text lines in the jObj.setBusyText? Thanks !
- Donn (12 days 17 hours ago): I would need more information to help you. Simulink Data Dictionary files (.sldd) files are covered in many places. What is the format of the Data dictionary files (.dd) you are...
- Temu (14 days 19 hours ago): Hi Yair, Thanks for sharing all these insights! These are really helpful. I am currently trying to implement a focus-follows-mouse mechanism in matlab, since versions from (at least)...
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).
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.
Advanced Matlab training courses/seminars will be presented by me (Yair) in Zürich, Switzerland on 29-30 August, 2017:
- August 29 (full day) – Interactive Matlab GUI
- August 30 (full day) – Advanced Matlab GUI
The seminars are targeted at Matlab users who wish to improve their program’s usability and professional appearance. Basic familiarity with the Matlab environment and coding/programming is assumed. The courses will present a mix of both documented and undocumented aspects, which is not available anywhere else. The curriculum is listed below.
This is a unique opportunity to enhance your Matlab coding skills and improve your program’s usability in a couple of days.
If you are interested in either or both of these seminars, please Email me (altmany at gmail dot com).
I can also schedule a dedicated visit to your location, for onsite Matlab training customized to your organization’s specific needs. Additional information can be found on my Training page.
Around the time of the training, I will be traveling to various locations around Switzerland. If you wish to meet me in person to discuss how I could bring value to your project, then please email me (altmany at gmail):
- Geneva: Aug 22 – 27
- Bern: Aug 27 – 28
- Zürich: Aug 28 – 30
- Stuttgart: Aug 30 – 31
- Basel: Sep 1 – 3
Prasad Kalane liked this post
A few months ago I wrote about various tricks for sending email/text messages from Matlab. Unfortunately, Matlab only sends text emails by default and provides no documented way to send HTML-formatted emails. Text-only emails are naturally very bland and all mail clients in the past 2 decades support HTML-formatted emails. Today I will show how we can send such HTML emails from Matlab.
A quick recap: Matlab’s sendmail function uses Java (specifically, the standard
javax.mail package) to prepare and send emails. The Java classes are extremely powerful and so there is no wonder that Mathworks chose to use them rather than reinventing the wheel. However, Matlab’s sendmail function only uses part of the functionality exposed by these classes (admittedly, the most important parts that deal with the basic mail-sending mechanism), and does not expose external hooks or input args that would enable the user to take full advantage of the more advanced features, HTML formatting included.
Only two small changes are needed in sendmail.m to support HTML formatting:
- HTML formatting required calling the message-object’s setContent() method, rather than setText().
- We need to specify
'text/html'as part of the message’s encoding
Back in 2010, I posted about Matlab’s undocumented mechanism for setting Matlab desktop tab-completions. That mechanism used a couple of internal files (TC.xml and TC.xsd) to describe the various possible options that are auto-completed (or displayed in a small tooltip window) when the user clicks the <Tab> key on partially-entered function input parameters.
Unfortunately, this mechanism apparently broke in R2016a and was replaced with a new mechanism, as explained below.
The new mechanism relies on a file called functionSignatures.json which exists in every single folder that contains Matlab files that have functions whose input parameters ought to be tab-completable.
The new mechanism offers far greater versatility and flexability in defining the input types and inter-relationsships compared to the old TC.*-based mechanism. Another important benefit is that we can now add custom user-defined functionSignatures.json files to our user folders, next to our m-files, without having to modify any Matlab system file.
My Matlab Expo 2016 keynote presentation (32:45)(Matlab Expo 2017 presentation will be different)
MathWorks were very kind to invite me to speak at the upcoming annual Matlab Expo in Bern, Switzerland, on June 22, 2017 at 15:30. My presentation will be about “MATLAB Tricks You Need to Know“.
I also presented at last year’s Expo in Munich (you can see the video on the right). So in order not to bore the audience, my presentation this year will be completely different – it will not focus on any single program or industry, but instead provide content that should be relevant to a large portion of Matlab users.
My presentation will highlight several simple-to-use tips and tricks that can improve Matlab program usability and performance, and Matlab programming productivity in general. My aim is to show that Matlab can be used to create professional-quality applications, without sacrificing Matlab’s benefits (RAD, functionality, reliability), and that Matlab is certainly relevant for serious user-facing applications, not just for prototyping and internal organizational use.
I am targeting the presentation at anyone who uses Matlab, with any level of experience. Many of the tricks will be easy enough to use that even novice users could benefit, and some tricks might be useful even to advanced users. All these tricks are simple to understand, and yet very effective for improving run-time performance and visualization quality.
Participation in the Bern Expo is free, please don’t hesitate to come. If you’re considering it, then you might also be interested in my Advanced Matlab seminars in Zurich earlier that same week, on June 19-20.
If you are in the area and wish to meet me to discuss how I could bring value to your work, then please email me (altmany at gmail) to coordinate a meeting. We could meet either at the Expo, or in a dedicated (private) meeting.
Update June 23, 2017: I am extremely disappointed to report that my presentation at the Matlab Expo in Bern yesterday was not video-recorded. I thought that it went quite well so this makes me very sad. Anyway, you can see my presentation slides here. It doesn’t contain all the explanations and extra details that I communicated verbally, but I think that it might still be useful as-is. I hope you find it beneficial!