{"id":292,"date":"2011-10-14T15:35:39","date_gmt":"2011-10-14T15:35:39","guid":{"rendered":"https:\/\/blogs.mathworks.com\/loren\/2011\/10\/14\/new-mat-file-functionality-in-r2011b\/"},"modified":"2011-10-03T15:47:18","modified_gmt":"2011-10-03T15:47:18","slug":"new-mat-file-functionality-in-r2011b","status":"publish","type":"post","link":"https:\/\/blogs.mathworks.com\/loren\/2011\/10\/14\/new-mat-file-functionality-in-r2011b\/","title":{"rendered":"New MAT-File Functionality in R2011b"},"content":{"rendered":"<div xmlns:mwsh=\"https:\/\/www.mathworks.com\/namespace\/mcode\/v1\/syntaxhighlight.dtd\" class=\"content\">\r\n   <introduction>\r\n      <p>Today I&#8217;d like to introduce guest blogger <a href=\"mailto:sarah.zaranek@mathworks.com\">Sarah Wait Zaranek<\/a> who works for the MATLAB Marketing team here at The MathWorks. Sarah previously has <a href=\"https:\/\/blogs.mathworks.com\/loren\/2008\/06\/25\/speeding-up-matlab-applications\/\">written<\/a> about speeding up code from a customer to get acceptable performance. She and I will be writing about the new capabilities\r\n         for MAT-files in R2011b.\r\n      <\/p>\r\n   <\/introduction>\r\n   <h3>Contents<\/h3>\r\n   <div>\r\n      <ul>\r\n         <li><a href=\"#1\">What's New for MAT-Files?<\/a><\/li>\r\n         <li><a href=\"#2\">Example:  Using Partial Reading<\/a><\/li>\r\n         <li><a href=\"#10\">Example:  Using Partial Writing<\/a><\/li>\r\n         <li><a href=\"#14\">Format and Indexing Limits<\/a><\/li>\r\n         <li><a href=\"#16\">Learn More<\/a><\/li>\r\n         <li><a href=\"#17\">Here's How to Create myBigData<\/a><\/li>\r\n         <li><a href=\"#18\">Try it Out<\/a><\/li>\r\n      <\/ul>\r\n   <\/div>\r\n   <h3>What's New for MAT-Files?<a name=\"1\"><\/a><\/h3>\r\n   <p>The new <tt>matfile<\/tt> function in R2011b allows you to efficiently <a href=\"https:\/\/www.mathworks.com\/help\/releases\/R2011b\/techdoc\/ref\/load.html\"><tt>load<\/tt><\/a> or <a href=\"https:\/\/www.mathworks.com\/help\/releases\/R2011b\/techdoc\/ref\/save.html\"><tt>save<\/tt><\/a> to parts of variables to MAT-Files. For you who are running into memory limits, loading part of a variable requires less\r\n      memory than loading the entire contents of that variable.  Previously, there was a way to read in separate variables from\r\n      a MAT-file but not load parts of a single variable. But now - it is possible to load in parts of your variable. Let&#8217;s see\r\n      this in action!\r\n   <\/p>\r\n   <h3>Example:  Using Partial Reading<a name=\"2\"><\/a><\/h3>\r\n   <p>We have a MAT-file (myBigData.mat) that contains the variable <tt>X<\/tt>. You can use the following to to see what variables are available in your MAT-file\r\n   <\/p><pre style=\"background: #F9F7F3; padding: 10px; border: 1px solid rgb(200,200,200)\">whos <span style=\"color: #A020F0\">-file<\/span> <span style=\"color: #A020F0\">myBigData<\/span><\/pre><pre style=\"font-style:oblique\">  Name          Size                   Bytes  Class     Attributes\r\n\r\n  X         10000x10000            800000000  double              \r\n\r\n<\/pre><p>Wow - <tt>X<\/tt> is almost a gigabyte in size.  Perfect for trying out this new partial read functionality.\r\n   <\/p>\r\n   <p>To read in part of a variable, first you create a object that corresponds to a MAT-File, such as<\/p><pre style=\"background: #F9F7F3; padding: 10px; border: 1px solid rgb(200,200,200)\">matObj = matfile(<span style=\"color: #A020F0\">'myBigData.mat'<\/span>);<\/pre><p>By running whos you can see that <tt>matObj<\/tt> is a <tt>matlab.io.MatFile<\/tt> object:\r\n   <\/p><pre style=\"background: #F9F7F3; padding: 10px; border: 1px solid rgb(200,200,200)\">whos <span style=\"color: #A020F0\">matObj<\/span><\/pre><pre style=\"font-style:oblique\">  Name        Size            Bytes  Class                Attributes\r\n\r\n  matObj      1x1               112  matlab.io.MatFile              \r\n\r\n<\/pre><p>Now you can access variables in the MAT-file as properties of <tt>matObj<\/tt>, with dot notation. This is similar to how you access the fields of structures in MATLAB.\r\n   <\/p><pre style=\"background: #F9F7F3; padding: 10px; border: 1px solid rgb(200,200,200)\">loadedData = matObj.X(1:4,1:4);\r\ndisp(loadedData)<\/pre><pre style=\"font-style:oblique\">      0.90579      0.35507      0.89227      0.31907\r\n      0.12699        0.997       0.2426      0.98605\r\n      0.91338      0.22417       0.1296      0.71818\r\n      0.63236      0.65245      0.22507      0.41318\r\n<\/pre><p>This now loads the data into the workspace.  Indices can be a single value, a range of values, or a colon (:).  However, note\r\n      that using the <tt>end<\/tt> syntax causes MATLAB to load the entire variable in to memory.\r\n   <\/p>\r\n   <p>Index this way<\/p><pre style=\"background: #F9F7F3; padding: 10px; border: 1px solid rgb(200,200,200)\">[nrows, ncols] = size(matObj, <span style=\"color: #A020F0\">'X'<\/span>);\r\nloadedData = matObj.X(nrows-10:nrows, ncols-10:ncols);<\/pre><p>instead of this way to avoid loading the whole variable.<\/p><pre>loadedData2 = matObj.X(end-10:end, end-10:end);<\/pre><p>You can now treat your loaded data just as you would any data in MATLAB. Let&#8217;s calculate and plot the row average of our data.\r\n      Every read has a bit of an overhead, so we want to balance the number of reads and the size of the data we bring into MATLAB's\r\n      memory.\r\n   <\/p><pre style=\"background: #F9F7F3; padding: 10px; border: 1px solid rgb(200,200,200)\">[nrows, ncols] = size(matObj,<span style=\"color: #A020F0\">'X'<\/span>);\r\ndataAvg = zeros(nrows,1);\r\nstepSize = 100;\r\n\r\n<span style=\"color: #0000FF\">for<\/span> ii =1:stepSize:nrows\r\n    loadedData = matObj.X(ii:ii+stepSize-1,:);\r\n    dataAvg(ii:ii+stepSize-1) = mean(loadedData,2);\r\n<span style=\"color: #0000FF\">end<\/span>\r\n\r\nplot(dataAvg)<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/images\/loren\/292\/PartialLoadSaveR11b_01.png\"> <h3>Example:  Using Partial Writing<a name=\"10\"><\/a><\/h3>\r\n   <p>Again we create an object that corresponds to a MAT-File but focus on writing instead of reading data.<\/p><pre style=\"background: #F9F7F3; padding: 10px; border: 1px solid rgb(200,200,200)\">matObj = matfile(<span style=\"color: #A020F0\">'myBigData2.mat'<\/span>,<span style=\"color: #A020F0\">'Writable'<\/span>,true);<\/pre><p>For existing files you will need to set the <tt>&#8216;Writable&#8217;<\/tt> flag to allow you to write to the file.  For new files, the default behavior is to allow write permissions.\r\n   <\/p>\r\n   <p>To partially write to a MAT-file, replace the existing data by the new data just as you normally would for variables in MATLAB.<\/p><pre style=\"background: #F9F7F3; padding: 10px; border: 1px solid rgb(200,200,200)\">matObj.X(81:100,81:100) = magic(20);<\/pre><p>If you do not index into the variable, the full variable is replaced.<\/p>\r\n   <p>You can also create variables or append to existing data<\/p><pre style=\"background: #F9F7F3; padding: 10px; border: 1px solid rgb(200,200,200)\">whos <span style=\"color: #A020F0\">-file<\/span> <span style=\"color: #A020F0\">myBigData2<\/span>\r\n\r\nmatObj.NewVar = rand;\r\nmatObj.X(:,10001) = rand(10000,1);\r\n\r\nwhos <span style=\"color: #A020F0\">-file<\/span> <span style=\"color: #A020F0\">myBigData2<\/span><\/pre><pre style=\"font-style:oblique\">  Name          Size                   Bytes  Class     Attributes\r\n\r\n  X         10000x10000            800000000  double              \r\n\r\n  Name            Size                   Bytes  Class     Attributes\r\n\r\n  NewVar          1x1                        8  double              \r\n  X           10000x10001            800080000  double              \r\n\r\n<\/pre><h3>Format and Indexing Limits<a name=\"14\"><\/a><\/h3>\r\n   <p><tt>matfile<\/tt> only supports partial loading and saving for MAT-files in Version 7.3 format.  If you index into a variable in a Version\r\n      7 or earlier MAT-file, MATLAB warns and temporarily loads the entire contents of the variable.  To save as version 7.3 format,\r\n      use the following syntax:\r\n   <\/p><pre style=\"background: #F9F7F3; padding: 10px; border: 1px solid rgb(200,200,200)\">save(<span style=\"color: #A020F0\">'mydata.mat'<\/span>,<span style=\"color: #A020F0\">'-v7.3'<\/span>);<\/pre><p><tt>matfile<\/tt> does not support <a href=\"https:\/\/www.mathworks.com\/help\/releases\/R2011b\/techdoc\/math\/f1-85462.html#f1-85511\">linear<\/a> indexing or <a href=\"https:\/\/www.mathworks.com\/help\/releases\/R2011b\/techdoc\/matlab_prog\/br04bw6-98.html#br04bw6-111\">multilevel<\/a> indexing, such as indexing into cells of cell arrays or fields of structure arrays.  To save structure fields as separate\r\n      variables to your MAT-file, you can use the following:\r\n   <\/p><pre style=\"background: #F9F7F3; padding: 10px; border: 1px solid rgb(200,200,200)\">S.a = <span style=\"color: #A020F0\">'try to save'<\/span>;\r\nS.b = 42;\r\nS.c = magic(10);\r\n\r\nsave(<span style=\"color: #A020F0\">'newstruct.mat'<\/span>, <span style=\"color: #A020F0\">'-struct'<\/span>, <span style=\"color: #A020F0\">'S'<\/span>,<span style=\"color: #A020F0\">'-v7.3'<\/span>)\r\nsave(<span style=\"color: #A020F0\">'newstruct2.mat'<\/span>, <span style=\"color: #A020F0\">'-struct'<\/span>, <span style=\"color: #A020F0\">'S'<\/span>, <span style=\"color: #A020F0\">'a'<\/span>, <span style=\"color: #A020F0\">'c'<\/span>,<span style=\"color: #A020F0\">'-v7.3'<\/span>)\r\n\r\nwhos <span style=\"color: #A020F0\">-file<\/span> <span style=\"color: #A020F0\">newstruct.mat<\/span>\r\nwhos <span style=\"color: #A020F0\">-file<\/span> <span style=\"color: #A020F0\">newstruct2.mat<\/span><\/pre><pre style=\"font-style:oblique\">  Name       Size            Bytes  Class     Attributes\r\n\r\n  a          1x11               22  char                \r\n  b          1x1                 8  double              \r\n  c         10x10              800  double              \r\n\r\n  Name       Size            Bytes  Class     Attributes\r\n\r\n  a          1x11               22  char                \r\n  c         10x10              800  double              \r\n\r\n<\/pre><h3>Learn More<a name=\"16\"><\/a><\/h3>\r\n   <p>You can learn more about this new functionality, by reading the <tt>matfile<\/tt> reference <a href=\"https:\/\/www.mathworks.com\/help\/releases\/R2011b\/techdoc\/ref\/matfile.html\">page<\/a> or by watching this <a href=\"https:\/\/www.mathworks.com\/support\/2011b\/matlab\/7.13\/demos\/new-matfile-object-in-release-2011b.html\">video<\/a>. There are known performance issues in some cases when using <tt>matfile<\/tt> that are currently being look into here at MathWorks.  We will update this blog with suggestions on best practices for performance\r\n      using <tt>matfile<\/tt> later.\r\n   <\/p>\r\n   <h3>Here's How to Create myBigData<a name=\"17\"><\/a><\/h3>\r\n   <p>Run the code in <tt>MakeData<\/tt>, and when it's complete, make a copy of the large MAT-file <tt>myBigData.mat<\/tt> to <tt>myBigData2<\/tt>.  Then you should be able to run this example with your R2011b installation.\r\n   <\/p><pre style=\"background: #F9F7F3; padding: 10px; border: 1px solid rgb(200,200,200)\">type <span style=\"color: #A020F0\">MakeData<\/span><\/pre><pre style=\"font-style:oblique\">\r\n% Create a large data file\r\nmatObj = matfile('myBigData.mat','Writable',true); \r\n\r\nmatObj.X(10000,10000) = 0;\r\n\r\nfor ii = 1:10\r\n   rangmin = (ii-1)*1000 + 1;\r\n   rangmax = rangmin + 999;\r\n   matObj.X(rangmin:rangmax,1:10000) = rand(1000,10000);\r\nend\r\n\r\n<\/pre><h3>Try it Out<a name=\"18\"><\/a><\/h3>\r\n   <p>Experiment with this new functionality, and let us know what you think about it by leaving a comment <a href=\"https:\/\/blogs.mathworks.com\/loren\/?p=292#respond\">here<\/a>.\r\n   <\/p><script language=\"JavaScript\">\r\n<!--\r\n\r\n    function grabCode_4709ec071aa5437eb98917be05870774() {\r\n        \/\/ Remember the title so we can use it in the new page\r\n        title = document.title;\r\n\r\n        \/\/ Break up these strings so that their presence\r\n        \/\/ in the Javascript doesn't mess up the search for\r\n        \/\/ the MATLAB code.\r\n        t1='4709ec071aa5437eb98917be05870774 ' + '##### ' + 'SOURCE BEGIN' + ' #####';\r\n        t2='##### ' + 'SOURCE END' + ' #####' + ' 4709ec071aa5437eb98917be05870774';\r\n    \r\n        b=document.getElementsByTagName('body')[0];\r\n        i1=b.innerHTML.indexOf(t1)+t1.length;\r\n        i2=b.innerHTML.indexOf(t2);\r\n \r\n        code_string = b.innerHTML.substring(i1, i2);\r\n        code_string = code_string.replace(\/REPLACE_WITH_DASH_DASH\/g,'--');\r\n\r\n        \/\/ Use \/x3C\/g instead of the less-than character to avoid errors \r\n        \/\/ in the XML parser.\r\n        \/\/ Use '\\x26#60;' instead of '<' so that the XML parser\r\n        \/\/ doesn't go ahead and substitute the less-than character. \r\n        code_string = code_string.replace(\/\\x3C\/g, '\\x26#60;');\r\n\r\n        author = 'Sarah Wait Zaranek';\r\n        copyright = 'Copyright 2011 The MathWorks, Inc.';\r\n\r\n        w = window.open();\r\n        d = w.document;\r\n        d.write('<pre>\\n');\r\n        d.write(code_string);\r\n\r\n        \/\/ Add author and copyright lines at the bottom if specified.\r\n        if ((author.length > 0) || (copyright.length > 0)) {\r\n            d.writeln('');\r\n            d.writeln('%%');\r\n            if (author.length > 0) {\r\n                d.writeln('% _' + author + '_');\r\n            }\r\n            if (copyright.length > 0) {\r\n                d.writeln('% _' + copyright + '_');\r\n            }\r\n        }\r\n\r\n        d.write('<\/pre>\\n');\r\n      \r\n      d.title = title + ' (MATLAB code)';\r\n      d.close();\r\n      }   \r\n      \r\n-->\r\n<\/script><p style=\"text-align: right; font-size: xx-small; font-weight:lighter;   font-style: italic; color: gray\"><br><a href=\"javascript:grabCode_4709ec071aa5437eb98917be05870774()\"><span style=\"font-size: x-small;        font-style: italic;\">Get \r\n            the MATLAB code \r\n            <noscript>(requires JavaScript)<\/noscript><\/span><\/a><br><br>\r\n      Published with MATLAB&reg; 7.13<br><\/p>\r\n<\/div>\r\n<!--\r\n4709ec071aa5437eb98917be05870774 ##### SOURCE BEGIN #####\r\n%% New MAT-File Functionality in R2011b\r\n% Today I\u00e2\u20ac\u2122d like to introduce guest blogger\r\n% <mailto:sarah.zaranek@mathworks.com Sarah Wait Zaranek> who works for the\r\n% MATLAB Marketing team here at The MathWorks. Sarah previously has\r\n% <https:\/\/blogs.mathworks.com\/loren\/2008\/06\/25\/speeding-up-matlab-applications\/\r\n% written> about speeding up code from a customer to get acceptable\r\n% performance. She and I will be writing about the new capabilities for\r\n% MAT-files in R2011b.\r\n\r\n%% What's New for MAT-Files?\r\n% The new |matfile| function in R2011b allows you to efficiently\r\n% <https:\/\/www.mathworks.com\/help\/releases\/R2011b\/techdoc\/ref\/load.html\r\n% |load|> or\r\n% <https:\/\/www.mathworks.com\/help\/releases\/R2011b\/techdoc\/ref\/save.html\r\n% |save|> to parts of variables to MAT-Files. For you who are running into\r\n% memory limits, loading part of a variable requires less memory than\r\n% loading the entire contents of that variable.  Previously, there was a\r\n% way to read in separate variables from a MAT-file but not load parts of a\r\n% single variable. But now - it is possible to load in parts of your\r\n% variable. Let\u00e2\u20ac\u2122s see this in action!\r\n%% Example:  Using Partial Reading\r\n% We have a MAT-file (myBigData.mat) that contains the variable |X|. You\r\n% can use the following to to see what variables are available in your\r\n% MAT-file\r\n\r\nwhos -file myBigData \r\n\r\n%%\r\n% Wow - |X| is almost a gigabyte in size.  Perfect for trying out this new\r\n% partial read functionality.\r\n\r\n%%\r\n% To read in part of a variable, first you create a object that corresponds\r\n% to a MAT-File, such as\r\n\r\nmatObj = matfile('myBigData.mat'); \r\n\r\n%%\r\n% By running whos you can see that |matObj| is a |matlab.io.MatFile|\r\n% object:\r\n\r\nwhos matObj\r\n\r\n%% \r\n% Now you can access variables in the MAT-file as properties of |matObj|,\r\n% with dot notation. This is similar to how you access the fields of\r\n% structures in MATLAB.\r\n\r\nloadedData = matObj.X(1:4,1:4);\r\ndisp(loadedData)\r\n\r\n%%\r\n% This now loads the data into the workspace.  Indices can be a single\r\n% value, a range of values, or a colon (:).  However, note that using the\r\n% |end| syntax causes MATLAB to load the entire variable in to memory.\r\n% \r\n% Index this way \r\n\r\n[nrows, ncols] = size(matObj, 'X');\r\nloadedData = matObj.X(nrows-10:nrows, ncols-10:ncols);\r\n\r\n%%\r\n% instead of this way to avoid loading the whole variable. \r\n%\r\n%  loadedData2 = matObj.X(end-10:end, end-10:end);\r\n\r\n%%\r\n% You can now treat your loaded data just as you would any data in MATLAB.\r\n% Let\u00e2\u20ac\u2122s calculate and plot the row average of our data. Every read has a\r\n% bit of an overhead, so we want to balance the number of reads and the\r\n% size of the data we bring into MATLAB's memory.\r\n\r\n[nrows, ncols] = size(matObj,'X');\r\ndataAvg = zeros(nrows,1);\r\nstepSize = 100;\r\n\r\nfor ii =1:stepSize:nrows\r\n    loadedData = matObj.X(ii:ii+stepSize-1,:);\r\n    dataAvg(ii:ii+stepSize-1) = mean(loadedData,2);\r\nend\r\n\r\nplot(dataAvg)\r\n\r\n%% Example:  Using Partial Writing\r\n% Again we create an object that corresponds to a MAT-File but focus on\r\n% writing instead of reading data.\r\n\r\nmatObj = matfile('myBigData2.mat','Writable',true);\r\n\r\n%%\r\n% For existing files you will need to set the |\u00e2\u20ac\u02dcWritable\u00e2\u20ac\u2122| flag to allow\r\n% you to write to the file.  For new files, the default behavior is to\r\n% allow write permissions.\r\n%\r\n% To partially write to a MAT-file, replace the existing data by the new\r\n% data just as you normally would for variables in MATLAB.\r\n%\r\nmatObj.X(81:100,81:100) = magic(20);\r\n\r\n%%\r\n% If you do not index into the variable, the full variable is replaced.\r\n\r\n%%\r\n% You can also create variables or append to existing data\r\n\r\nwhos -file myBigData2\r\n\r\nmatObj.NewVar = rand;\r\nmatObj.X(:,10001) = rand(10000,1);\r\n\r\nwhos -file myBigData2 \r\n\r\n%% Format and Indexing Limits\r\n% |matfile| only supports partial loading and saving for MAT-files in Version\r\n% 7.3 format.  If you index into a variable in a Version 7 or earlier\r\n% MAT-file, MATLAB warns and temporarily loads the entire contents of the\r\n% variable.  To save as version 7.3 format, use the following syntax:\r\n\r\nsave('mydata.mat','-v7.3');\r\n\r\n%%\r\n% |matfile| does not support\r\n% <https:\/\/www.mathworks.com\/help\/releases\/R2011b\/techdoc\/math\/f1-85462.html#f1-85511\r\n% linear> indexing or\r\n% <https:\/\/www.mathworks.com\/help\/releases\/R2011b\/techdoc\/matlab_prog\/br04bw6-98.html#br04bw6-111\r\n% multilevel> indexing, such as indexing into cells of cell arrays or\r\n% fields of structure arrays.  To save structure fields as separate\r\n% variables to your MAT-file, you can use the following:\r\n\r\nS.a = 'try to save';\r\nS.b = 42;\r\nS.c = magic(10);\r\n\r\nsave('newstruct.mat', '-struct', 'S','-v7.3')  \r\nsave('newstruct2.mat', '-struct', 'S', 'a', 'c','-v7.3')\r\n\r\nwhos -file newstruct.mat\r\nwhos -file newstruct2.mat\r\n\r\n%% Learn More \r\n% You can learn more about this new functionality, by reading the |matfile|\r\n% reference\r\n% <https:\/\/www.mathworks.com\/help\/releases\/R2011b\/techdoc\/ref\/matfile.html\r\n% page> or by watching this\r\n% <https:\/\/www.mathworks.com\/support\/2011b\/matlab\/7.13\/demos\/new-matfile-object-in-release-2011b.html\r\n% video>. There are known performance issues in some cases when using\r\n% |matfile| that are currently being look into here at MathWorks.  We will\r\n% update this blog with suggestions on best practices for performance using\r\n% |matfile| later.\r\n%% Here's How to Create myBigData\r\n% Run the code in |MakeData|, and when it's complete, make a copy of the\r\n% large MAT-file |myBigData.mat| to |myBigData2|.  Then you should be able\r\n% to run this example with your R2011b installation.\r\ntype MakeData\r\n\r\n%% Try it Out\r\n% Experiment with this new functionality, and let us know what you think\r\n% about it by leaving a comment\r\n% <https:\/\/blogs.mathworks.com\/loren\/?p=292#respond here>.\r\n\r\n\r\n##### SOURCE END ##### 4709ec071aa5437eb98917be05870774\r\n-->","protected":false},"excerpt":{"rendered":"<p>\r\n   \r\n      Today I&#8217;d like to introduce guest blogger Sarah Wait Zaranek who works for the MATLAB Marketing team here at The MathWorks. Sarah previously has written about speeding up code from... <a class=\"read-more\" href=\"https:\/\/blogs.mathworks.com\/loren\/2011\/10\/14\/new-mat-file-functionality-in-r2011b\/\">read more >><\/a><\/p>","protected":false},"author":39,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[45,7],"tags":[],"_links":{"self":[{"href":"https:\/\/blogs.mathworks.com\/loren\/wp-json\/wp\/v2\/posts\/292"}],"collection":[{"href":"https:\/\/blogs.mathworks.com\/loren\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.mathworks.com\/loren\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.mathworks.com\/loren\/wp-json\/wp\/v2\/users\/39"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.mathworks.com\/loren\/wp-json\/wp\/v2\/comments?post=292"}],"version-history":[{"count":0,"href":"https:\/\/blogs.mathworks.com\/loren\/wp-json\/wp\/v2\/posts\/292\/revisions"}],"wp:attachment":[{"href":"https:\/\/blogs.mathworks.com\/loren\/wp-json\/wp\/v2\/media?parent=292"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.mathworks.com\/loren\/wp-json\/wp\/v2\/categories?post=292"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.mathworks.com\/loren\/wp-json\/wp\/v2\/tags?post=292"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}