Undocumented Matlab
  • SERVICES
    • Consulting
    • Development
    • Training
    • Gallery
    • Testimonials
  • PRODUCTS
    • IQML: IQFeed-Matlab connector
    • IB-Matlab: InteractiveBrokers-Matlab connector
    • EODML: EODHistoricalData-Matlab connector
    • Webinars
  • BOOKS
    • Secrets of MATLAB-Java Programming
    • Accelerating MATLAB Performance
    • MATLAB Succinctly
  • ARTICLES
  • ABOUT
    • Policies
  • CONTACT
  • SERVICES
    • Consulting
    • Development
    • Training
    • Gallery
    • Testimonials
  • PRODUCTS
    • IQML: IQFeed-Matlab connector
    • IB-Matlab: InteractiveBrokers-Matlab connector
    • EODML: EODHistoricalData-Matlab connector
    • Webinars
  • BOOKS
    • Secrets of MATLAB-Java Programming
    • Accelerating MATLAB Performance
    • MATLAB Succinctly
  • ARTICLES
  • ABOUT
    • Policies
  • CONTACT

Setting system tray popup messages

March 31, 2009 21 Comments

Continuing my previous post about setting system-tray icons, I will now show how to set informational popup messages next to these icons.
Asynchronous informational messages can be presented next to the sys-tray icon, in a fashion similar to what we came to expect from modern programs. This could be used to indicate some unexpected event that was detected, or the end of a complex calculation phase. The message title, text and severity icon are all customizable.
Unfortunately, the Java method used to display messages, java.awt.TrayIcon.displayMessage(), expects an object of type java.awt.TrayIcon.MessageType, which is an enumeration within the TrayIcon class. However, Matlab’s dot-notation does not recognize what should have been the following correct notation, so we need to resort to Java reflection:

>> trayIcon.displayMessage('title','info msg',TrayIcon.MessageType.INFO);
??? No appropriate method or public field MessageType for class java.awt.TrayIcon
>> trayIconClasses = trayIcon.getClass.getClasses;
>> trayIconClasses(1)
ans =
class java.awt.TrayIcon$MessageType	<= hurray!!!
>> MessageTypes = trayIconClasses(1).getEnumConstants
MessageTypes =
java.awt.TrayIcon$MessageType[]:
    [java.awt.TrayIcon$MessageType]	<= 1: ERROR
    [java.awt.TrayIcon$MessageType]	<= 2: WARNING
    [java.awt.TrayIcon$MessageType]	<= 3: INFO
    [java.awt.TrayIcon$MessageType]	<= 4: NONE
>> trayIcon.displayMessage('title','info msg',MessageTypes(3));

systray INFO message

and another example, now with a WARNING icon:
systray WARNING message

If the title string is left empty, then neither title nor the severity icon will be displayed. The message can still be manually dismissed by clicking within its boundaries:

systray messages without a title (hence also without a severity icon)
systray messages without a title (hence also without a severity icon)

Informational popup messages are automatically aligned and positioned by the system. Messages are automatically dismissed by the system after some time, if not dismissed by the user first. The exact time is determined by system and user activity and other such external factors. Informational messages replace one another, if the previous message has still not been cleared by the user.
I have created a utility function called SYSTRAY, which is a convenience function that facilitates the setup and update of system tray icons and messages. SYSTRAY (with source code) can be downloaded from the File Exchange.
I would be happy to hear if and how you’re using the new system-tray functionality in your application – let me know below.

Related posts:

  1. Setting system tray icons – System-tray icons can be programmatically set and controlled from within Matlab, using new functionality available since R2007b....
  2. Customizing help popup contents – The built-in HelpPopup, available since Matlab R2007b, has a back-door that enables displaying arbitrary text, HTML and URL web-pages....
  3. Matlab toolstrip – part 9 (popup figures) – Custom popup figures can be attached to Matlab GUI toolstrip controls. ...
  4. Sending email/text messages from Matlab – Sending emails and SMS (text) messages from Matlab is easy, once you know a few quirks....
  5. Setting status-bar text – The Matlab desktop and figure windows have a usable statusbar which can only be set using undocumented methods. This post shows how to set the status-bar text....
  6. Better MEX error messages – The default clunky and release-incompatible MEX error messages can be improved using a simple hack. ...
Desktop Icons Java
Print Print
« Previous
Next »
21 Responses
  1. Jason McMains July 10, 2009 at 08:06 Reply

    Yair,
    Thanks again for this utility, just thought I would let you know that I’m using this to replace any helpdlg boxes that I previously used to give process direction during a program, like click here, or define this range. Using this, a user can breeze through a program if they know what to do, or go slowly and read the pop-ups.

  2. Updating speaker sound volume | Undocumented Matlab October 15, 2009 at 09:14 Reply

    […] Unfortunately, Matlab prevents using Java classnames containing a period (e.g., Port.Info) or static Interface values, so we cannot directly access Port.Info.SPEAKER or FloatControl.Type.VOLUME. I’ve reported this bug to Mathworks earlier this year, and I do not know in which Matlab release (if at all) they intend to fix it. Until then we need to use workarounds, as in the code above. I posted a similar issue (and its workaround) earlier in this blog, when setting system-tray popup message. […]

  3. Albert December 17, 2009 at 05:11 Reply

    On the version (R2007b) of Matlab I use this statement does not work:
    trayIconClasses = trayIcon.getClass.getClasses;
    ??? No method ‘getClass’ with matching signature found for class ‘java.awt.TrayIcon’.

    Is it supprted on later versions?

    • Yair Altman December 27, 2009 at 15:53 Reply

      Albert – it should work on Matlab installations that run JVM 1.6+. To determine your JVM version, type the following in your Command Window:

      version -java

      version -java

      If this is not helpful, try to inspect the trayIcon object using the methodsview function, to see why the getClass method fails:

      methodsview(trayIcon);

      methodsview(trayIcon);

  4. andandgui June 4, 2010 at 12:29 Reply

    i couldn’t run SoundVolume function on Matlab.. When i write SoundVolume=10; then nothing happens .. How can i run the SoundVolume function which is written at

    http://undocumentedmatlab.com/blog/updating-speaker-sound-volume/

    • Yair Altman June 5, 2010 at 11:19 Reply

      @andandgui – did you even read the SoundVolume help?

      SoundVolume is not a variable that you can assign like SoundVolume=10, but a function that accepts input parameters like SoundVolume (1.0) and it only accepts values between 0.0-1.0 so 10 is not a valid value.

      Also, next time, please post the question in the relevant page (http://undocumentedmatlab.com/blog/updating-speaker-sound-volume/) – your question has nothing to do with this page.

  5. Peter June 16, 2010 at 02:54 Reply

    Dear Yair

    This looks like a great utility. Unfortunately it does not work properly on my system (Matlab 2010a, Windows XP, Java 1.6.0_12-b04). To start with I call

    hIcon = systray('C:Program FilesMATLABR2010atoolboxmatlabiconshelp_ex.png');

    hIcon = systray('C:Program FilesMATLABR2010atoolboxmatlabiconshelp_ex.png');

    Afterwards, the only command that works is the set command for deletion. Setting message pop-ups and the like does not work (does not yield any error messages, but does not affect the icon).

    Furthermore, if I click the icon in the system tray I get the exception pasted below.

    Have you any suggestions on how to get around this. I have tried the exception fix you link to on the uisplitpane post, but that does not help either. Thanks for a great site and lots of cool applications

    Peter

    Exception in thread “AWT-EventQueue-0″ java.lang.ClassCastException: 
    java.awt.TrayIcon cannot be cast to java.awt.Component
    at com.mathworks.widgets.tooltip.ToolTipAndComponentAWTListener.mouseInTipComponent(ToolTipAndComponentAWTListener.java:175)
    at com.mathworks.widgets.tooltip.ToolTipAndComponentAWTListener.eventDispatched(ToolTipAndComponentAWTListener.java:125)
    at java.awt.Toolkit$SelectiveAWTEventListener.eventDispatched(Unknown Source)
    at java.awt.Toolkit$ToolkitEventMulticaster.eventDispatched(Unknown Source)
    ...
    at java.awt.Toolkit$ToolkitEventMulticaster.eventDispatched(Unknown Source)
    at java.awt.Toolkit.notifyAWTEventListeners(Unknown Source)
    at java.awt.TrayIcon.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

    Exception in thread “AWT-EventQueue-0″ java.lang.ClassCastException: java.awt.TrayIcon cannot be cast to java.awt.Component at com.mathworks.widgets.tooltip.ToolTipAndComponentAWTListener.mouseInTipComponent(ToolTipAndComponentAWTListener.java:175) at com.mathworks.widgets.tooltip.ToolTipAndComponentAWTListener.eventDispatched(ToolTipAndComponentAWTListener.java:125) at java.awt.Toolkit$SelectiveAWTEventListener.eventDispatched(Unknown Source) at java.awt.Toolkit$ToolkitEventMulticaster.eventDispatched(Unknown Source) ... at java.awt.Toolkit$ToolkitEventMulticaster.eventDispatched(Unknown Source) at java.awt.Toolkit.notifyAWTEventListeners(Unknown Source) at java.awt.TrayIcon.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source)

    • Mike September 10, 2011 at 05:31 Reply

      That looks like a “bug.” I’ll ask them to fix it, but the earliest it would be done would be 12b, if at all…

    • Yair Altman September 10, 2011 at 09:44 Reply

      @Mike – thanks – couldn’t ask for anything more

  6. Setting status-bar text | Undocumented Matlab June 23, 2010 at 03:09 Reply

    […] Note: Users interested in non-intrusive status-bar messages, may also be interested in another non-intrusive messaging mechanism which I have described some months ago: Setting system tray popup messages. […]

  7. Alexander September 9, 2011 at 05:58 Reply

    Dear Yair,

    as all the others I’d like to thank you for the wonderful systray tool. It’s really great.

    While I implemented it these days in an old 2007b installation, it worked without any problem. (At least after having included the solution for the messages as pointed out in your uisplitpane entry).

    Now I’m trying to migrate to 2010bSP1 and stumbled over two problems:

    a) Java complained about setting the popup entry enabled using your line

    set(menuItem,'Enabled',get(thisItem,'Enable'));

    set(menuItem,'Enabled',get(thisItem,'Enable'));

    As I’m not familiar with java: Is the workaround

    menuItem.setEnabled(strcmp(get(thisItem,'Enable'),'on'));

    menuItem.setEnabled(strcmp(get(thisItem,'Enable'),'on'));

    valid?

    b) I get the same error message as Peter mentioned above when trying to access the popup menu:

    Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.awt.TrayIcon cannot be cast to java.awt.Component
    	at com.mathworks.widgets.tooltip.ToolTipAndComponentAWTListener.mouseInTipComponent(ToolTipAndComponentAWTListener.java:177)
    	at com.mathworks.widgets.tooltip.ToolTipAndComponentAWTListener.eventDispatched(ToolTipAndComponentAWTListener.java:128)
    	at java.awt.Toolkit$SelectiveAWTEventListener.eventDispatched(Unknown Source)
    	at java.awt.Toolkit$ToolkitEventMulticaster.eventDispatched(Unknown Source)
    	at java.awt.Toolkit$ToolkitEventMulticaster.eventDispatched(Unknown Source)
    	at java.awt.Toolkit$ToolkitEventMulticaster.eventDispatched(Unknown Source)
    	at java.awt.Toolkit$ToolkitEventMulticaster.eventDispatched(Unknown Source)
    	at java.awt.Toolkit$ToolkitEventMulticaster.eventDispatched(Unknown Source)
    	at java.awt.Toolkit$ToolkitEventMulticaster.eventDispatched(Unknown Source)
    	at java.awt.Toolkit$ToolkitEventMulticaster.eventDispatched(Unknown Source)
    	at java.awt.Toolkit.notifyAWTEventListeners(Unknown Source)
    	at java.awt.TrayIcon.dispatchEvent(Unknown Source)
    	at java.awt.EventQueue.dispatchEvent(Unknown Source)
    	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.run(Unknown Source)

    Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.awt.TrayIcon cannot be cast to java.awt.Component at com.mathworks.widgets.tooltip.ToolTipAndComponentAWTListener.mouseInTipComponent(ToolTipAndComponentAWTListener.java:177) at com.mathworks.widgets.tooltip.ToolTipAndComponentAWTListener.eventDispatched(ToolTipAndComponentAWTListener.java:128) at java.awt.Toolkit$SelectiveAWTEventListener.eventDispatched(Unknown Source) at java.awt.Toolkit$ToolkitEventMulticaster.eventDispatched(Unknown Source) at java.awt.Toolkit$ToolkitEventMulticaster.eventDispatched(Unknown Source) at java.awt.Toolkit$ToolkitEventMulticaster.eventDispatched(Unknown Source) at java.awt.Toolkit$ToolkitEventMulticaster.eventDispatched(Unknown Source) at java.awt.Toolkit$ToolkitEventMulticaster.eventDispatched(Unknown Source) at java.awt.Toolkit$ToolkitEventMulticaster.eventDispatched(Unknown Source) at java.awt.Toolkit$ToolkitEventMulticaster.eventDispatched(Unknown Source) at java.awt.Toolkit.notifyAWTEventListeners(Unknown Source) at java.awt.TrayIcon.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source)

    As I learned, this is an Java 1.6 issue. Is there a workaround on the Matlab-level for systray available? Or what else could be done?

    Best wishes,

    Alexander

    • Alexander September 9, 2011 at 07:16 Reply

      Update:

      Going through the implementation in 2010b I found a second problematic point. In line 232, the “ActionPerformedCallback” is set. This also drops an warning. Now I found on of your infos on using set/get with core java object in the entry on Uicontrol callbacks. Is it thus reasonable to change

      set(menuItem,'ActionPerformedCallback',get(thisItem,'Callback'));

      set(menuItem,'ActionPerformedCallback',get(thisItem,'Callback'));

      to

      set(handle(menuItem,'CallbackProperties'),'ActionPerformedCallback',get(thisItem,'Callback'));

      set(handle(menuItem,'CallbackProperties'),'ActionPerformedCallback',get(thisItem,'Callback'));

      If so, I’d suggest to make an update of the FileExchange version (also including the comments made in the uisplitpanel entry). If not, I’m really interested in a workaround.

      Alexander

      • Yair Altman September 9, 2011 at 07:42

        @Alexander – using menuItem.setEnabled() is indeed safe and valid, and in fact better than using set(…). Your fix for using CallbackProperties is also correct – this is described in another article.

        Unfortunately, I do not have a solution for the popup message errors at this time. If I do, I will post it on this page.

  8. fahad December 8, 2011 at 02:01 Reply

    thanks for the code and the explanation with picures

  9. Thierry Dalon January 10, 2013 at 06:42 Reply

    Hi Yair
    nice utility!
    In the post you don’t provide the code for the multi-line example.
    Do you use char(10) for breaking lines? Example:

    systray(hIconTray,'Message',{'title',['informational message',char(10),'Second line'],'info'})

    systray(hIconTray,'Message',{'title',['informational message',char(10),'Second line'],'info'})

    It may be nice if the systray function would accept as message as cellstr and breaking lines automatically like usual in Matlab msgbox.
    Example:

    systray(hIconTray,'Message',{'title',{'informational message','Second line'},'info'})

    systray(hIconTray,'Message',{'title',{'informational message','Second line'},'info'})

    • Yair Altman January 10, 2013 at 10:22 Reply

      @Thierry – indeed, char(10) can be used to break lines in the systray message.

      You might also try to use HTML formatting with a <br/> tag (untested, but I think it should work).

      Cell arrays are currently not supported unfortunately.

    • Thierry Dalon January 11, 2013 at 05:41 Reply

      One could convert cellstr in multi-lines char with one line:
      msg={‘Another’,’multi-line’,’Example’}
      sprintf(‘%s\n’,msg{:})
      so one can then pass it to systray.

  10. Thierry Dalon January 16, 2013 at 03:13 Reply

    For handling recurring warnings because of java exceptions I’ve come to the solution to clear the java events on mouse click. I had also to update the list of exceptions. See extracted code below:

    set(trayIcon,'MousePressedCallback',@clearexc)
     
    function clearexc()
       t = java.awt.Toolkit.getDefaultToolkit();
       ev = t.getAWTEventListeners();
       for i = 1 : length(ev)
          str = ev(i).getListener().getClass.toString;  
          if str.indexOf('com.mathworks.mwswing.desk.DTSelectionManager') >= 0 || ... % see http://undocumentedmatlab.com/blog/uisplitpane/#comment-658
             str.indexOf('javax.swing.plaf.basic.BasicLookAndFeel') >= 0 || ...
             str.indexOf('com.mathworks.widgets.text.mcode.MLintDecorator') >= 0 || ...
             str.indexOf('com.mathworks.widgets.desk.DTSelectionManager') >=0 || ... % TD
             str.indexOf('com.mathworks.widgets.grouptable.ToolTipSupport') >=0 || ... % TD
             str.indexOf('com.mathworks.widgets.text.STPMessagePanel') >=0 || ... % TD
             str.indexOf('com.mathworks.widgets.text.MWToolTipSupport') >=0 || ... % TD->crashes on double-click
             str.indexOf('com.mathworks.widgets.tooltip') >=0, % TD
                t.removeAWTEventListener(ev(i));
                %disp(str)
          end
       end  % for ev
    end  % function clearexc

    set(trayIcon,'MousePressedCallback',@clearexc) function clearexc() t = java.awt.Toolkit.getDefaultToolkit(); ev = t.getAWTEventListeners(); for i = 1 : length(ev) str = ev(i).getListener().getClass.toString; if str.indexOf('com.mathworks.mwswing.desk.DTSelectionManager') >= 0 || ... % see http://undocumentedmatlab.com/blog/uisplitpane/#comment-658 str.indexOf('javax.swing.plaf.basic.BasicLookAndFeel') >= 0 || ... str.indexOf('com.mathworks.widgets.text.mcode.MLintDecorator') >= 0 || ... str.indexOf('com.mathworks.widgets.desk.DTSelectionManager') >=0 || ... % TD str.indexOf('com.mathworks.widgets.grouptable.ToolTipSupport') >=0 || ... % TD str.indexOf('com.mathworks.widgets.text.STPMessagePanel') >=0 || ... % TD str.indexOf('com.mathworks.widgets.text.MWToolTipSupport') >=0 || ... % TD->crashes on double-click str.indexOf('com.mathworks.widgets.tooltip') >=0, % TD t.removeAWTEventListener(ev(i)); %disp(str) end end % for ev end % function clearexc

    • Reymon July 24, 2014 at 03:33 Reply

      I used your code but I have eccepetion with this too.

      When I use this code this code any exception. Is this true?

      set(tray,'MousePressedCallback',@clearexc)
      t = java.awt.Toolkit.getDefaultToolkit();
      ev = t.getAWTEventListeners();
      for i = 1 : length(ev)
          str = ev(i).getListener().getClass.toString;
          t.removeAWTEventListener(ev(i));
      end

      set(tray,'MousePressedCallback',@clearexc) t = java.awt.Toolkit.getDefaultToolkit(); ev = t.getAWTEventListeners(); for i = 1 : length(ev) str = ev(i).getListener().getClass.toString; t.removeAWTEventListener(ev(i)); end

      Is any problem with this code?

      Thanks

  11. Thierry Dalon January 16, 2013 at 03:14 Reply

    I could not find a way to delete/clear the current popup message…

    • Yair Altman January 23, 2013 at 04:30 Reply

      @Thierry – the popup is in general automatically removed by the operating system after several seconds. You can always set the popup message to empty (see the code in systray utility (setIconMessage() sub-function).

      You can also delete and recreate the systray to get the same effect as workaround. Read the code in the systray utility to see how (basically, java.awt.SystemTray.getSystemTray.remove(jcomp)).

Leave a Reply
HTML tags such as <b> or <i> are accepted.
Wrap code fragments inside <pre lang="matlab"> tags, like this:
<pre lang="matlab">
a = magic(3);
disp(sum(a))
</pre>
I reserve the right to edit/delete comments (read the site policies).
Not all comments will be answered. You can always email me (altmany at gmail) for private consulting.

Click here to cancel reply.

Useful links
  •  Email Yair Altman
  •  Subscribe to new posts (feed)
  •  Subscribe to new posts (reader)
  •  Subscribe to comments (feed)
 
Accelerating MATLAB Performance book
Recent Posts

Speeding-up builtin Matlab functions – part 3

Improving graphics interactivity

Interesting Matlab puzzle – analysis

Interesting Matlab puzzle

Undocumented plot marker types

Matlab toolstrip – part 9 (popup figures)

Matlab toolstrip – part 8 (galleries)

Matlab toolstrip – part 7 (selection controls)

Matlab toolstrip – part 6 (complex controls)

Matlab toolstrip – part 5 (icons)

Matlab toolstrip – part 4 (control customization)

Reverting axes controls in figure toolbar

Matlab toolstrip – part 3 (basic customization)

Matlab toolstrip – part 2 (ToolGroup App)

Matlab toolstrip – part 1

Categories
  • Desktop (45)
  • Figure window (59)
  • Guest bloggers (65)
  • GUI (165)
  • Handle graphics (84)
  • Hidden property (42)
  • Icons (15)
  • Java (174)
  • Listeners (22)
  • Memory (16)
  • Mex (13)
  • Presumed future risk (394)
    • High risk of breaking in future versions (100)
    • Low risk of breaking in future versions (160)
    • Medium risk of breaking in future versions (136)
  • Public presentation (6)
  • Semi-documented feature (10)
  • Semi-documented function (35)
  • Stock Matlab function (140)
  • Toolbox (10)
  • UI controls (52)
  • Uncategorized (13)
  • Undocumented feature (217)
  • Undocumented function (37)
Tags
AppDesigner (9) Callbacks (31) Compiler (10) Desktop (38) Donn Shull (10) Editor (8) Figure (19) FindJObj (27) GUI (141) GUIDE (8) Handle graphics (78) HG2 (34) Hidden property (51) HTML (26) Icons (9) Internal component (39) Java (178) JavaFrame (20) JIDE (19) JMI (8) Listener (17) Malcolm Lidierth (8) MCOS (11) Memory (13) Menubar (9) Mex (14) Optical illusion (11) Performance (78) Profiler (9) Pure Matlab (187) schema (7) schema.class (8) schema.prop (18) Semi-documented feature (6) Semi-documented function (33) Toolbar (14) Toolstrip (13) uicontrol (37) uifigure (8) UIInspect (12) uitable (6) uitools (20) Undocumented feature (187) Undocumented function (37) Undocumented property (20)
Recent Comments
Contact us
Captcha image for Custom Contact Forms plugin. You must type the numbers shown in the image
Undocumented Matlab © 2009 - Yair Altman
This website and Octahedron Ltd. are not affiliated with The MathWorks Inc.; MATLAB® is a registered trademark of The MathWorks Inc.
Scroll to top