Adam Danz
Adam Danz
最後のアクティビティ: 2023 年 1 月 15 日

We've all been there. You've got some kind of output that displays perfectly in the command window and you just want to capture that display as a string so you can use it again somewhere else. Maybe it's a multidimensional array, a table, a structure, or a fit object that perfectly displays the information you need in a neat and tidy format but when you try to recreate the display in a string variable it's like reconstructing the Taj Mahal out of legos.

Enter Matlab r2021a > formattedDisplayText()

Use str=formattedDisplayText(var) the same way you use disp(var) except instead of displaying the output, it's stored as a string as it would appear in the command window.

Additional name-value pairs allow you to

  • Specify a numeric format
  • Specify loose|compact line spacing
  • Display true|false instead of 1|0 for logical values
  • Include or suppress markup formatting that may appear in the display such as the bold headers in tables.

Demo: Record the input table and results of a polynomial curve fit

load census
[fitobj, gof] = fit(cdate, pop, 'poly3', 'normalize', 'on')

Results printed to the command window:

fitobj = 
     Linear model Poly3:
     fitobj(x) = p1*x^3 + p2*x^2 + p3*x + p4
       where x is normalized by mean 1890 and std 62.05
     Coefficients (with 95% confidence bounds):
       p1 =       0.921  (-0.9743, 2.816)
       p2 =       25.18  (23.57, 26.79)
       p3 =       73.86  (70.33, 77.39)
       p4 =       61.74  (59.69, 63.8)
gof = 
  struct with fields:
             sse: 149.77
         rsquare: 0.99879
             dfe: 17
      adjrsquare: 0.99857
            rmse: 2.9682

Capture the input table, the printed fit object, and goodness-of-fit structure as strings:

rawDataStr = formattedDisplayText(table(cdate,pop),'SuppressMarkup',true)
fitStr = formattedDisplayText(fitobj)
gofStr = formattedDisplayText(gof)

Display the strings:

rawDataStr = 
    "    cdate     pop 
         _____    _____
         1790       3.9
         1800       5.3
         1810       7.2
         1820       9.6
         1830      12.9
         1840      17.1
         1850      23.1
         1860      31.4
         1870      38.6
         1880      50.2
         1890      62.9
         1900        76
         1910        92
         1920     105.7
         1930     122.8
         1940     131.7
         1950     150.7
         1960       179
         1970       205
         1980     226.5
         1990     248.7
     "
fitStr = 
    "     Linear model Poly3:
          ary(x) = p1*x^3 + p2*x^2 + p3*x + p4
            where x is normalized by mean 1890 and std 62.05
          Coefficients (with 95% confidence bounds):
            p1 =       0.921  (-0.9743, 2.816)
            p2 =       25.18  (23.57, 26.79)
            p3 =       73.86  (70.33, 77.39)
            p4 =       61.74  (59.69, 63.8)
     "
gofStr = 
    "           sse: 149.77
            rsquare: 0.99879
                dfe: 17
         adjrsquare: 0.99857
               rmse: 2.9682
     "

Combine the strings into a single string and write it to a text file in your temp directory:

txt =  strjoin([rawDataStr; fitStr; gofStr],[newline newline]);
file = fullfile(tempdir,'results.txt');
fid = fopen(file,'w+');
cleanup = onCleanup(@()fclose(fid)); 
fprintf(fid, '%s', txt);
clear cleanup

Open results.txt.

winopen(file) % for Windows platforms
Image Analyst
Image Analyst
最後のアクティビティ: 2023 年 1 月 11 日

an undergraduate student
41%
in graduate school
28%
in academia (prof, staff, etc.)
11%
in industry or Non-Gov't Org. (NGO)
11%
in government or military
3%
self employed, retired, or hobbyist
6%
7627 票
Chen Lin
Chen Lin
最後のアクティビティ: 2023 年 1 月 9 日

Every year, we show our appreciation to the top contributors by awarding two types of annual badges: Most Accepted badge and Top Downloads badge.
Most Accepted badge goes to the top 10 contributors whose answers received the most acceptances. Top downloads badge goes to the top 10 contributors with the most downloaded submissions.
In 2022, the recipients for Most Accepted are: @Walter Roberson, @Voss, @Star Strider, @Torsten, @Image Analyst, @Matt J, @KSSV, @Jan, @Stephen23, and @DGM.
Congratulations and thank you again for your outstanding contribution in 2022!
Don't waste time searching-just ask
6%
A few minutes or 1-2 searches
21%
A few hours, most Qs aren't unique
40%
Days-asking for help is last resort
14%
Infinite. I'll never ask a question
20%
23801 票
MathWorks is hosting the QIT Boston event to discuss Ethical AI for the LGBTQ+ community on its Lakeside campus, hosted by our own Heather Gorr, PhD.
AI is known to learn biases from the various sources that affects our daily lives, and in particular minority groups like LGBTQ+.
Join the discussion to what the impacts are, where the biases come from, and how to mitigate as you develop AI.
Sign up here
https://www.eventbrite.com/e/oit-boston-panel-discussion-ethical-ai-for-the-lgbtq-community-registration-496419814027
Toshiaki Takeuchi
Toshiaki Takeuchi
最後のアクティビティ: 2022 年 12 月 21 日

Congratulations, @DGM, for hitting this important milestone!
You provided 2,007 anwers and received 529 votes. Thank you for your contribution to the community!
MATLAB Central Team
Adam Danz
Adam Danz
最後のアクティビティ: 2022 年 11 月 29 日

New to r2020a, leapseconds() creates a table showing all leap seconds recognized by the datetime data type.

>> leapseconds()
ans =
  27×2 timetable
       Date        Type    CumulativeAdjustment
    ___________    ____    ____________________
    30-Jun-1972     +              1 sec       
    31-Dec-1972     +              2 sec       
    31-Dec-1973     +              3 sec       
    31-Dec-1974     +              4 sec       
    31-Dec-1975     +              5 sec       
             << 21 rows removed >>
    31-Dec-2016     +             27 sec   

Leap seconds can covertly sneak into your data and cause errors that are difficult to resolve if the leap seconds go undetected. A leap second was responsible for crashing Reddit , Mozilla, Yelp, LinkedIn and other sites in 2012.

Detect leap seconds present in a vector of years

% Define a vector of years
t = 2005:2008; 
allLeapSeconds = leapseconds(); 
isYearWithLeapSecond = ismember(t,year(allLeapSeconds.Date));
% Show years that contain a leap second
t(isYearWithLeapSecond)
ans =
        2005        2008

Detect leap seconds present in a vector of months

% Define a vector of months 
t = datetime(1972, 1, 1) + calmonths(0:11);
t.Format = 'MMM-yyyy';
allLeapSeconds = leapseconds(); 
[tY,tM] = ymd(t); 
[leapSecY, leapSecM] = ymd(allLeapSeconds.Date); 
isMonthWithLeapSecond = ismember([tY(:),tM(:)], [leapSecY, leapSecM], 'rows');
% Show months that contain a leap second
t(isMonthWithLeapSecond)
ans = 
  1×2 datetime array
   Jun-1972   Dec-1972

List all leap seconds in your lifetime

% Enter your birthday in mm/dd/yyyy hh:mm:ss format
yourBirthday = '01/15/1988 14:30:00'; 
yourTimeRange = timerange(datetime(yourBirthday), datetime('now')); 
allLeapSeconds = leapseconds(); 
lifeLeapSeconds = allLeapSeconds(yourTimeRange,:);
lifeLeapSeconds.YourAge = lifeLeapSeconds.Date - datetime(yourBirthday);
lifeLeapSeconds.YourAge.Format = 'y';
% Show table
fprintf('\n Leap seconds in your lifetime:\n')
disp(lifeLeapSeconds)
Leap seconds in your lifetime:
       Date        Type    CumulativeAdjustment     YourAge  
    ___________    ____    ____________________    __________
    31-Dec-1989     +             15 sec           1.9587 yrs
    31-Dec-1990     +             16 sec            2.958 yrs
                        << 8 rows removed >>
    30-Jun-2012     +             25 sec           24.456 yrs
    30-Jun-2015     +             26 sec           27.454 yrs
    31-Dec-2016     +             27 sec            28.96 yrs

What is a leap second?

A second is defined as the time it takes a cesium-133 atom to oscillate 9,192,631,770 times under controlled conditions. The transition frequency is so precise that it takes 100 million years to gain 1 second of error [1]. If the earth’s rotation were perfectly synchronized to the atomic second, a day would be 86,400 seconds. But the earth’s rate of rotation is affected by climate, winds, atmospheric pressure, and the rate of rotation is gradually decreasing due to tidal friction [2,3]. Several months before the expected difference between the atomic clock-based time (UTC) and universal time (UT1) reaches +/- 0.9 seconds the IERS authorizes the addition (or subtraction) of 1 leap second (see plot below). Since the first leap second in 1972, all leap second adjustments have been made on the last day of June or December and all adjustments have been +1 second which explains the + signs in the type column of the leapseconds() table.

[ Image source ]

How to reference the leap second schedule in your code

Since leap second adjustments are not regularly timed, you can record the official IERS Bulletin C version used at the time of your analysis by accessing the 2nd output to leapseconds().

[T,vers] = leapseconds

What do leap seconds look like in datetime values?

A minute typically has 60 seconds spanning from 0:59. A minute containing a leap second has 61 seconds spanning from 0:60.

December 30, 2016 was a normal day. If we add the usual 86400 seconds to the start of that day, the result is the start of the next day.

d = datetime(2016, 12, 30, 'TimeZone','UTCLeapSeconds') + seconds(86400)
d = 
  datetime
   2016-12-31T00:00:00.000Z

The next day, December 31, 2016, had a leap second. If we add 86400 seconds to the start of that day, the result is not the start of the next day.

d = datetime(2016, 12, 31, 'TimeZone','UTCLeapSeconds') + seconds(86400)
d = 
  datetime
   2016-12-31T23:59:60.000Z

When will the next leap second be?

As of the current date (April 2020) the timing of the next leap second is unknown. Based on the data from the plot above, what's your guess?

References

  1. https://www.timeanddate.com/time/how-do-atomic-clocks-work.html
  2. https://www.nasa.gov/centers/goddard/news/topstory/2003/0210rotation.html
  3. https://en.wikipedia.org/wiki/%CE%94T#Universal_time
Chen Lin
Chen Lin
最後のアクティビティ: 2022 年 11 月 16 日

MATLAB Documentation
47%
Videos
14%
MOOCs
2%
MATLAB Central Community
14%
Examples
22%
Other(Explain in comments)
2%
2608 票
Ambient | Atmospheric | Nature
9%
Classical | Jazz | Musicals
10%
Electronic | Dubstep | House | VGM
15%
Lo-fi | Chill | Coffee House
22%
Rock | Metal | Pop | Punk | Hip Hop
27%
Other | Podcasts | Nothing
17%
753 票
Toshiaki Takeuchi
Toshiaki Takeuchi
最後のアクティビティ: 2022 年 11 月 7 日

Congratulations, @KSSV, for hitting this important milestone!
You provided 10,958 anwers at the acceptance rate of 78.95% and received 3,126 votes. Thank you for your contribution to the community!
MATLAB Central Team
Toshiaki Takeuchi
Toshiaki Takeuchi
最後のアクティビティ: 2022 年 11 月 7 日

Congratulations, @Matt J for reaching this major milestone!
You provided 9717 answers at the acceptance rate of 75.23% and received 3281 votes. Thank you for your contribution to the community!
MATLAB Central Team
Chen Lin
Chen Lin
最後のアクティビティ: 2022 年 11 月 1 日

You are invited to enter 2 fun community contests: MATLAB Mini Hack 2022 and Cody 10th Anniversary. The contests are designed for you to have fun, win prizes, and sharpen MATLAB skills. Participants across all skill levels are welcome to join!
How to Play
1. MATLAB Mini Hack 2022 contest:
Use up to 280 characters of MATLAB code to generate an interesting image. Sounds challenging? You can still participate by simply voting for the images you love.
2. Cody 10th Anniversary contest:
Solve at least 1 Cody problem per day during the 4-week contest period. We will reward participants with the longest streak of days of problem-solving!
Prizes
You will have opportunities to win compelling prizes, including Amazon gift cards, MathWorks T-shirts, and virtual badges. We will give out both weekly prizes and grand prizes. Check out the rules & prize section on each contest page for details.
Interested in joining? Follow the contests!
Click the ‘Follow the contests’ button to follow/register for the contest. You will get notified when the contests start. After contests start, you will also receive important announcements and prize information.
Chen Lin
Chen Lin
最後のアクティビティ: 2022 年 10 月 30 日

In MATLAB Answers, oftentimes we see good comments that provide solutions in a question thread. Those comments should really be answers. On the other hand, there are some answers that do not offer solutions. Those answers should actually be comments. The answer/comment issue makes it harder for readers of a question thread to quickly identify useful information. To tackle this issue, the community team just released the MOVE feature!
What can be moved?
Answers and comments can now be moved in 4 ways within the same question thread:
  1. Change an answer to a comment
  2. Change an answer with comments to a group of comments
  3. Change a comment to an answer
  4. Move a comment
Who can move answers and comments?
New privileges have been awarded to contributors with 2000 reputation points or more. Privileged contributors will see move icons added in the list of actions available for answers and comments.
After an answer or comment is moved, an indication of the move will be displayed with the content.
As always, please let us know your thoughts by leaving a reply below.
Chen Lin
Chen Lin
最後のアクティビティ: 2022 年 10 月 22 日

What amazing images can be created with no more than 280 characters of MATLAB code? Check out the GALLERY from the MATLAB Mini Hack 2022 contest.
Vote on your favorite MATLAB images before Oct. 30th! We will give out MathWorks T-shirt to 10 lucky voters.
How can I vote?
You can vote for an entry by clicking on the heart icon on an entry card or the vote button on the entry detail page.
Adam Danz
Adam Danz
最後のアクティビティ: 2022 年 10 月 14 日

New in R2022b: GridSizeChangedFcn
tiledlayout() creates a TiledChartLayout object that defines a gridded layout of axes within a figure. When using the 'flow' option, the grid size becomes dynamic and updates as axes are added or as the figure size changes. These features were introduced in R2019b and if you're still stuck on using subplot, you're missing out on several other great features of tiledlayout.
Starting in MATLAB R2022b you can define a callback function that responds to changes to the grid size in flow arrangements by setting the new gridSizeChangedFcn.
Use case
I often use a global legend to represent data across all axes within a figure. When the figure is tall and narrow, I want the legend to be horizontally oriented at the bottom of the figure but when the figure is short and wide, I prefer a vertically oriented legend on the right of the figure. By using the gridSizeChangedFcn, now I can update the legend location and orientation when the grid size changes.
Demo
gridSizeChangeFcn works like all other graphics callback functions. In this demo, I've named the gridSizeChangedFcn "updateLegendLayout", assigned by an anonymous function. The first input is the TiledChartLayout object and the second input is the event object that indicates the old and new grid sizes. The legend handle is also passed into the function. Since all of the tiles contain the same groups of data, the legend is based on data in the last tile.
As long as the legend is valid, the gridSizeChangedFcn updates the location and orientation of the legend so that when the grid is tall, the legend will be horizontal at the bottom of the figure and when the grid is wide, the legend will be vertical at the right of the figure.
Since the new grid size is available as a property in the TiledChartLayout object, I chose not to use the event argument. This way I can directly call the callback function at the end to update the legend without having to create an event.
Run this example from an m-file. Then change the width or height of the figure to demonstrate the legend adjustments.
% Prepare data
data1 = sort(randn(6))*10;
data2 = sort(randn(6))*10;
labels = ["A","B","C","D","E","F"];
groupLabels = categorical(["Control", "Test"]);
% Generate figure
fig = figure;
tcl = tiledlayout(fig, "flow", TileSpacing="compact", Padding="compact");
nTiles = height(data1);
h = gobjects(1,nTiles);
for i = 1:nTiles
ax = nexttile(tcl);
groupedData = [data1(i,:); data2(i,:)];
h = bar(ax,groupLabels, groupedData, "grouped");
title(ax,"condition " + i)
end
title(tcl,"GridSizeChangedFcn Demo")
ylabel(tcl,"Score")
legh = legend(h, labels);
title(legh,"Factors")
% Define and call the GridSizeChangeFcn
tcl.GridSizeChangedFcn = @(tclObj,event)updateLegendLayout(tclObj,event,legh);
updateLegendLayout(tcl,[],legh);
% Manually resize the vertical and horizontal dimensions of the figure
function updateLegendLayout(tclObj,~,legh)
% Evoked when the TiledChartLayout grid size changes in flow arrangements.
% tclObj - TiledChartLayout object
% event - (unused in this demo) contains old and new grid size
% legh - legend handle
if isgraphics(legh,'legend')
if tclObj.GridSize(1) > tclObj.GridSize(2)
legh.Layout.Tile = "south";
legh.Orientation = "horizontal";
else
legh.Layout.Tile = "east";
legh.Orientation = "vertical";
end
end
end
Give it a shot in MATLAB R2022b
  • Replace the legend with a colorbar to update the location and orientation of the colorbar.
  • Define a GridSizeChangedFcn within the loop so that it is called every time a tile is added.
  • Create a figure with many tiles (~20) and dynamically set a color to each row of axes.
  • Assign xlabels only to the bottom row of tiles and ylabels to only the left column of tiles.
Learn about other new features
This article is attached as a live script.
Simulink is a block diagram environment used to design systems with multidomain models, simulate before moving to hardware, and deploy without writing code. In this livestream, Sam and Nishan will build up the basics of getting started using Simulink to build models.
Sign up here to get notification when it start streaming at 11:00 am (EDT) on Oct 13 view your timezone
Adam Danz
Adam Danz
最後のアクティビティ: 2022 年 10 月 2 日

Uniform spacing and the problem of round-off error
The vector [3 4 5 6 7 8 9] is uniformly spaced with a step size of 1. So is [3 2 1 0 -1 -2] but with a step size of -1.
The vector [1 2 4 8] is not uniformly spaced.
A vector v with uniform spacing has the same finite interval or step size between consecutive elements of the vector. But sometimes round-off error poses a problem in calculating uniformity.
Take, for example, the vector produced by
format shortg
v = linspace(1,9,7)
v = 1x7
1 2.3333 3.6667 5 6.3333 7.6667 9
Linspace produces linearly spaced vectors but the intervals between elements of v, computed by diff(v), are not identical.
dv = diff(v)
dv = 1x6
1.3333 1.3333 1.3333 1.3333 1.3333 1.3333
dv == dv(1)
ans = 1×6 logical array
1 0 0 1 0 1
diff(dv)
ans = 1x5
4.4409e-16 0 -4.4409e-16 8.8818e-16 -8.8818e-16
Some extra steps are therefore necessary to set a tolerance that ignores error introduced by floating point arithmetic.
New in R2022b: isuniform
Determining uniformity of a vector became a whole lot easier in MATLAB R2022b with the new isuniform function.
isuniform returns a logical scalar indicating whether vector v is uniformly spaced within a round-off tolerance and returns the step size (or NaN if v is not uniform).
Let's look at the results for our vector v,
[tf,step] = isuniform(v)
tf = logical
1
step =
1.3333
How about non-uniformly spaced vector?
[tf,step] = isuniform(logspace(1,5,4))
tf = logical
0
step =
NaN
Give it a shot in MATLAB R2022b
  • What happens when all elements of v are equal?
  • Can you produce a vector with uniform spacing without using colons or linspace?
  • What additional steps would be needed to use isuniform with circular data?
References
This article is attached as a live script.
Always or usually. They're fun.
18%
Sometimes, some of them.
7%
Not yet, but probably will some day
25%
Never, and don't plan to.
50%
3937 票
Adam Danz
Adam Danz
最後のアクティビティ: 2022 年 9 月 21 日

Starting in MATLAB R2021a axis tick labels will auto-rotate to avoid overlap when the user manually specifies ticks or tick labels ( release notes ). In custom visualization functions, the tick label density or tick label lengths may be variable and unknown. The new auto-rotation feature removes the burden of detecting the need to rotate manually-set labels and eliminates the need to manually rotate them.

Many properties and combinations of properties can cause tick labels to overlap if they are not rotated.

  • Length of tick labels
  • Number of tick labels
  • Interval between tick labels
  • Font size
  • Font name
  • Figure size
  • Axes size
  • Viewing angle of the axes

Demo: varying tick density and length of tick labels

These 9 axes vary by the number of x-ticks and length of x-tick-labels. MATLAB auto-rotates the labels when needed.

Demo: Changes to axis view angle and rotation

The auto-rotation feature updates the label angles as the axes change programmatically or during user interaction.

What if I don't want auto-rotation?

Auto-rotation mode is on by default for each X|Y|Z axis. When the tick label rotation angle is manually set from the X|Y|ZTickLabelRotation property of axes or by using xtickangle | ytickangle | ztickangle , auto-rotation is turned off. Auto-rotation can also be turned off by setting the X|Y|ZTickLabelRotationMode axis property to manual but it's important to also hold the axis properties so that the rotation mode does not revert to the default value, auto. If you're looking for a broader method of reverting to older behavior you can set the default label rotation mode to manual at the start of a function that produces multiple plots and then revert to the factory default rotation mode at the end of the file (consider using onCleanup).

set(groot,'defaultAxesXTickLabelRotationMode','manual')
set(groot,'defaultAxesYTickLabelRotationMode','manual')
set(groot,'defaultAxesZTickLabelRotationMode','manual')
% Revert to factory-default
set(groot,'defaultAxesXTickLabelRotationMode','remove')
set(groot,'defaultAxesYTickLabelRotationMode','remove')
set(groot,'defaultAxesZTickLabelRotationMode','remove')

A copy of this Community Highlight is attached as a live script.

We are thrilled to share that more than 400,000 people have subscribed to MATLAB YouTube channel to watch MATLAB and Simulink videos!🎉🙌🥳🎉🙌🥳🎉🙌🥳
The channel started way back in 2006, only one year after YouTube launched. Since then, people have spent more than 2.3 million hours watching our videos. It took us 12 years to reach 100k subscribers, two more years to get to 200k subs, and only 2 years to double that and grow to 400,000!
Did you know that in 2021, there were almost 10 million views to our videos on YouTube?
Thank you again for supporting our community inside and outside MATLAB Central!

Highlights について

View announcements and updates in the MATLAB and Simulink product community, including MATLAB Central and Discussions.

Share your feedback and join the conversation by participating in polls posted by staff and community power users. These polls appear across MathWorks.com, so look for them while signed in to community pages.