{"id":6802,"date":"2021-03-22T10:06:25","date_gmt":"2021-03-22T14:06:25","guid":{"rendered":"https:\/\/blogs.mathworks.com\/cleve\/?p=6802"},"modified":"2021-03-27T10:26:49","modified_gmt":"2021-03-27T14:26:49","slug":"mount-st-helens-and-matrix-rank","status":"publish","type":"post","link":"https:\/\/blogs.mathworks.com\/cleve\/2021\/03\/22\/mount-st-helens-and-matrix-rank\/","title":{"rendered":"Mount St. Helens and Matrix Rank"},"content":{"rendered":"<div class=\"content\"><!--introduction--><p>What do Mount St. Helens and the rank of a matrix have in common? The answer is the MATLAB function <tt>peaks<\/tt>.  Let me explain. Please bear with me -- it's a long story.<\/p><!--\/introduction--><h3>Contents<\/h3><div><ul><li><a href=\"#26e4c9a3-fc99-457e-b237-429da9cf9bfd\">Mount St. Helens<\/a><\/li><li><a href=\"#2a4f3ebd-3711-4f54-8ed9-af405a2dde29\">Rank Revealing Factorizations<\/a><\/li><li><a href=\"#03f58f98-068a-4c0a-b9c8-ca714f13b10a\">C*inv(W)*R<\/a><\/li><li><a href=\"#8b842ee4-cb22-4d27-809c-d6751f639938\">peaks<\/a><\/li><li><a href=\"#239d67ea-75c2-4622-b8c7-5d5d2eba4295\">Rank<\/a><\/li><li><a href=\"#435da465-81a9-43a7-8dea-1245e506e440\">Reformulate<\/a><\/li><li><a href=\"#441d6c21-9fdd-4c23-95aa-6c1942b1d265\">Check<\/a><\/li><\/ul><\/div><h4>Mount St. Helens<a name=\"26e4c9a3-fc99-457e-b237-429da9cf9bfd\"><\/a><\/h4><p><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"http:\/\/blogs.mathworks.com\/cleve\/files\/mt_st_helens.jpg\" alt=\"\"> <\/p><p><a href=\"https:\/\/en.wikipedia.org\/wiki\/Mount_St._Helens\">Mount St. Helens<\/a> is an active volcano in the Cascade Range near Portland, Oregon and Seattle, Washington.  She had a dramatic eruption in May 1980. Four years after the eruption, I moved to Beaverton, Oregon to join a spinoff from Intel that was developing one of the world's first commercial parallel computers, <a href=\"https:\/\/blogs.mathworks.com\/cleve\/2013\/11\/12\/the-intel-hypercube-part-2-reposted\/\">the iPSC<\/a>.  In Beaverton, I met two guys from <a href=\"https:\/\/blogs.mathworks.com\/cleve\/2014\/02\/17\/the-tektronix-4081\/\">Tektronix<\/a>, a company famous for oscilloscopes that was then trying to get into computer graphics.  These guys, whose names I don't remember, were plotting a surface that resembled Mount St Helens.  That surface eventually became the MATLAB function <a href=\"https:\/\/www.mathworks.com\/help\/matlab\/ref\/peaks.html\">peaks<\/a>, which is a function of two variables that is useful for demonstrating <tt>surf<\/tt>, <tt>mesh<\/tt>, <tt>pcolor<\/tt> and <tt>contour<\/tt>.<\/p><pre class=\"codeinput\">   small_fig\r\n   clear\r\n   P = peaks;\r\n   surf(P)\r\n   axis <span class=\"string\">tight<\/span>\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"http:\/\/blogs.mathworks.com\/cleve\/files\/peaks2_blog_01.png\" alt=\"\"> <h4>Rank Revealing Factorizations<a name=\"2a4f3ebd-3711-4f54-8ed9-af405a2dde29\"><\/a><\/h4><p>Two months ago, I wrote a <a href=\"https:\/\/blogs.mathworks.com\/cleve\/2021\/01\/15\/cr-and-cab-rank-revealing-matrix-factorizations\/\">blog post<\/a> about rank revealing matrix factorizations, It is hard to think of the array <tt>P<\/tt> that we obtain from <tt>peaks<\/tt> as the representation of a linear transformation and a test matrix, but it is.  In fact, for any positive integer <tt>n<\/tt>, <tt>peaks(n)<\/tt> is an <tt>n<\/tt> -by- <tt>n<\/tt> matrix.  The default has <tt>n<\/tt> = 49.<\/p><p>I was very surprised when I discovered that for any <tt>n<\/tt> &gt; 2, the rank of <tt>peaks(n)<\/tt> is only 3.<\/p><pre class=\"codeinput\">   rankP = rank(P)\r\n<\/pre><pre class=\"codeoutput\">\r\nrankP =\r\n\r\n     3\r\n\r\n<\/pre><h4>C*inv(W)*R<a name=\"03f58f98-068a-4c0a-b9c8-ca714f13b10a\"><\/a><\/h4><p>MATLAB's <tt>rank<\/tt> counts nonzero singular values, but we can also try the <a href=\"https:\/\/blogs.mathworks.com\/cleve\/2021\/01\/15\/cr-and-cab-rank-revealing-matrix-factorizations\/\">factorization<\/a> <tt>P = C*inv(W)*R<\/tt>. We intend to use <tt>car<\/tt> only on small matrices that have integer entries. This <tt>P<\/tt> is neither small nor integer, but that doesn't stop us. <tt>car<\/tt> also finds the rank is 3.<\/p><pre class=\"codeinput\">   [C,W,R] = car(P);\r\n   whos\r\n<\/pre><pre class=\"codeoutput\">  Name        Size            Bytes  Class     Attributes\r\n\r\n  C          49x3              1176  double              \r\n  P          49x49            19208  double              \r\n  R           3x49             1176  double              \r\n  W           3x3                72  double              \r\n  rankP       1x1                 8  double              \r\n\r\n<\/pre><p>The 49-by-3 matrix <tt>C<\/tt> is the first three columns of <tt>P<\/tt> and the 3-by-49 matrix <tt>R<\/tt> is the first three rows of <tt>P<\/tt>. The 3-by-3 matrix <tt>W<\/tt> is their intersection, <tt>P(1:3,1:3)<\/tt>. These three matrices lie safely out of the reach of volcanic eruptions.  Here they are, in color.<\/p><pre class=\"codeinput\">   d = .1;\r\n   n = 49;\r\n   r = 3;\r\n   s = [patch([1-d n+d n+d 1-d 1-d],[1-d 1-d r+d r+d 1-d],[d d d d d],<span class=\"string\">'c'<\/span>)\r\n        patch([1-d r+d r+d 1-d 1-d],[1-d 1-d n+d n+d 1-d],[d d d d d],<span class=\"string\">'y'<\/span>)\r\n        patch([1-d r+d r+d 1-d 1-d],[1-d 1-d r+d r+d 1-d],[d d d d d],<span class=\"string\">'m'<\/span>)];\r\n   legend(s,{<span class=\"string\">'C'<\/span>,<span class=\"string\">'R'<\/span>,<span class=\"string\">' W'<\/span>}, <span class=\"string\">'position'<\/span>,[.75 .62 .12 .12]);\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"http:\/\/blogs.mathworks.com\/cleve\/files\/peaks2_blog_02.png\" alt=\"\"> <p>Plots of <tt>C<\/tt> and <tt>R<\/tt> do not easily reveal the fact that they contain enough information to reconstruct the entire surface <tt>P<\/tt>.<\/p><pre class=\"codeinput\">   subplot(2,1,1)\r\n   plot(C,<span class=\"string\">'.-'<\/span>,<span class=\"string\">'linewidth'<\/span>,1,<span class=\"string\">'markersize'<\/span>,12)\r\n   title(<span class=\"string\">'C'<\/span>)\r\n\r\n   subplot(2,1,2)\r\n   plot(R',<span class=\"string\">'.-'<\/span>,<span class=\"string\">'linewidth'<\/span>,1,<span class=\"string\">'markersize'<\/span>,12)\r\n   title(<span class=\"string\">'R'<\/span>)\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"http:\/\/blogs.mathworks.com\/cleve\/files\/peaks2_blog_03.png\" alt=\"\"> <h4>peaks<a name=\"8b842ee4-cb22-4d27-809c-d6751f639938\"><\/a><\/h4><p>The function <tt>peaks<\/tt> begins by generating matrices <tt>x<\/tt> and <tt>y<\/tt> that sample a continuous real variable on the interval <tt>[-3,3]<\/tt>.  Setting the meshsize <tt>dx = 1\/8<\/tt> leads to <tt>n = 49<\/tt>.  Smaller mesh sizes lead to larger matrices, but they all have rank 3.<\/p><pre class=\"codeinput\">   dx = 1\/8;\r\n   [x,y] = meshgrid(-3:dx:3);\r\n<\/pre><p>The core of <tt>peaks<\/tt> is this formula, which must be something like the one that the Tektronix guys were using for their Mt. St. Helens It is not obvious that the formula always generates a matrix of low rank.<\/p><pre class=\"codeinput\">   z =  3*(1-x).^2.*exp(-(x.^2) - (y+1).^2) <span class=\"keyword\">...<\/span>\r\n      - 10*(x\/5 - x.^3 - y.^5).*exp(-x.^2-y.^2) <span class=\"keyword\">...<\/span>\r\n      - 1\/3*exp(-(x+1).^2 - y.^2);\r\n<\/pre><h4>Rank<a name=\"239d67ea-75c2-4622-b8c7-5d5d2eba4295\"><\/a><\/h4><p>The rest of this post is devoted to proving that <tt>rank(z) = 3<\/tt>.<\/p><p>Here are two important facts about the rank of sums and pointwise products.<\/p><div><ul><li><tt>rank(A + B) &lt;= rank(A) + rank(B)<\/tt><\/li><li><tt>rank(A.*B) &lt;= min(rank(A),rank(B))<\/tt><\/li><\/ul><\/div><p>In particular, if A and B are both rank one, then<\/p><div><ul><li><tt>rank(A + B) &lt;= 2<\/tt><\/li><li><tt>rank(A.*B) &lt;= 1<\/tt><\/li><\/ul><\/div><h4>Reformulate<a name=\"435da465-81a9-43a7-8dea-1245e506e440\"><\/a><\/h4><p>Let's factor out the exponentials using this function.<\/p><pre class=\"codeinput\">   E = @(x,a) exp(-(x+a).^2);\r\n<\/pre><p>So, here is <tt>z<\/tt> again.<\/p><pre class=\"codeinput\">   z =  3*(1-x).^2.*E(x,0).*E(y,1) <span class=\"keyword\">...<\/span>\r\n      - 10*(x\/5 - x.^3 - y.^5).*E(x,0).*E(y,0) <span class=\"keyword\">...<\/span>\r\n      - 1\/3.*E(x,1).*E(y,0);\r\n<\/pre><p>Let <tt>z1<\/tt> be the first term.<\/p><pre class=\"codeinput\">   z1 =  (3*(1-x).^2).*E(x,0).*E(y,1);\r\n<\/pre><p><tt>rank(z1) = 1<\/tt> because <tt>z1<\/tt> is the pointwise product of three matrices. There is no sum.<\/p><p>Let<\/p><pre class=\"codeinput\">   zx = -10*(x\/5 - x.^3).*E(x,0) - 1\/3.*E(x,1);\r\n   zy = (10*y.^5).*E(x,0);\r\n<\/pre><p><tt>rank(zx) = 1<\/tt> because <tt>zx<\/tt> does not involve <tt>y<\/tt>.<\/p><p><tt>rank(zy) = 1<\/tt> because <tt>zy<\/tt> is a pointwise product.<\/p><pre class=\"codeinput\">   z2 =  (zx + zy).*E(y,0);\r\n<\/pre><p><tt>rank(z2) = (1 + 1)*1 = 2<\/tt><\/p><pre class=\"codeinput\">   z = z1 + z2;\r\n<\/pre><p><tt>rank(z) = 1 + 2 = 3<\/tt><\/p><h4>Check<a name=\"441d6c21-9fdd-4c23-95aa-6c1942b1d265\"><\/a><\/h4><p>My original <tt>P<\/tt> is still in the workspace.<\/p><pre class=\"codeinput\">  check = norm(P - z,inf)\r\n<\/pre><pre class=\"codeoutput\">\r\ncheck =\r\n\r\n   1.3517e-14\r\n\r\n<\/pre><script language=\"JavaScript\"> <!-- \r\n    function grabCode_c8dfdcfa0fc94c559ece3ef8ba8cc56f() {\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='c8dfdcfa0fc94c559ece3ef8ba8cc56f ' + '##### ' + 'SOURCE BEGIN' + ' #####';\r\n        t2='##### ' + 'SOURCE END' + ' #####' + ' c8dfdcfa0fc94c559ece3ef8ba8cc56f';\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        copyright = 'Copyright 2021 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 copyright line at the bottom if specified.\r\n        if (copyright.length > 0) {\r\n            d.writeln('');\r\n            d.writeln('%%');\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     --> <\/script><p style=\"text-align: right; font-size: xx-small; font-weight:lighter;   font-style: italic; color: gray\"><br><a href=\"javascript:grabCode_c8dfdcfa0fc94c559ece3ef8ba8cc56f()\"><span style=\"font-size: x-small;        font-style: italic;\">Get \r\n      the MATLAB code <noscript>(requires JavaScript)<\/noscript><\/span><\/a><br><br>\r\n      Published with MATLAB&reg; R2020a<br><\/p><\/div><!--\r\nc8dfdcfa0fc94c559ece3ef8ba8cc56f ##### SOURCE BEGIN #####\r\n%% Mount St. Helens and Matrix Rank\r\n% What do Mount St. Helens and the rank of a matrix have in common? \r\n% The answer is the MATLAB function |peaks|.  Let me explain.\r\n% Please bear with me REPLACE_WITH_DASH_DASH it's a long story.\r\n\r\n%% Mount St. Helens\r\n%\r\n% <<mt_st_helens.jpg>> \r\n%\r\n% <https:\/\/en.wikipedia.org\/wiki\/Mount_St._Helens\r\n% Mount St. Helens> is an active volcano in the Cascade Range near\r\n% Portland, Oregon and Seattle, Washington.  She had a\r\n% dramatic eruption in May 1980.\r\n% Four years after the eruption, I moved to Beaverton, Oregon to join\r\n% a spinoff from Intel that was developing one of the world's first\r\n% commercial parallel computers,\r\n% <https:\/\/blogs.mathworks.com\/cleve\/2013\/11\/12\/the-intel-hypercube-part-2-reposted\/\r\n% the iPSC>.  In Beaverton, I met two guys from\r\n% <https:\/\/blogs.mathworks.com\/cleve\/2014\/02\/17\/the-tektronix-4081\/\r\n% Tektronix>, a company\r\n% famous for oscilloscopes that was then trying to get into computer\r\n% graphics.  These guys, whose names I don't remember, were plotting a\r\n% surface that resembled Mount St Helens.  That surface eventually\r\n% became the MATLAB function\r\n% <https:\/\/www.mathworks.com\/help\/matlab\/ref\/peaks.html\r\n% peaks>, which is a\r\n% function of two variables that is useful for demonstrating |surf|,\r\n% |mesh|, |pcolor| and |contour|.\r\n\r\n   small_fig\r\n   clear\r\n   P = peaks;\r\n   surf(P)\r\n   axis tight\r\n   \r\n%% Rank Revealing Factorizations\r\n% Two months ago, I wrote a \r\n% <https:\/\/blogs.mathworks.com\/cleve\/2021\/01\/15\/cr-and-cab-rank-revealing-matrix-factorizations\/\r\n% blog post> about rank revealing matrix factorizations,\r\n% It is hard to think of the array |P| that we obtain\r\n% from |peaks| as the representation of a linear transformation and\r\n% a test matrix, but it is.  In fact, for any positive integer |n|,\r\n% |peaks(n)| is an |n| -by- |n| matrix.  The default has |n| = 49.\r\n\r\n%%\r\n% I was very surprised when I discovered that for any |n| > 2, the rank\r\n% of |peaks(n)| is only 3.\r\n\r\n   rankP = rank(P)\r\n\r\n%% C*inv(W)*R\r\n% MATLAB's |rank| counts nonzero singular values, but we can also try the\r\n% <https:\/\/blogs.mathworks.com\/cleve\/2021\/01\/15\/cr-and-cab-rank-revealing-matrix-factorizations\/\r\n% factorization> |P = C*inv(W)*R|.\r\n% We intend to use |car| only on small matrices that have integer entries.\r\n% This |P| is neither small nor integer, but that doesn't stop us.\r\n% |car| also finds the rank is 3.  \r\n\r\n   [C,W,R] = car(P);\r\n   whos\r\n   \r\n%%\r\n% The 49-by-3 matrix |C| is the first three columns of |P|\r\n% and the 3-by-49 matrix |R| is the first three rows of |P|.\r\n% The 3-by-3 matrix |W| is their intersection, |P(1:3,1:3)|.\r\n% These three matrices lie safely out of the reach of volcanic\r\n% eruptions.  Here they are, in color.\r\n\r\n   d = .1;\r\n   n = 49;\r\n   r = 3;\r\n   s = [patch([1-d n+d n+d 1-d 1-d],[1-d 1-d r+d r+d 1-d],[d d d d d],'c')\r\n        patch([1-d r+d r+d 1-d 1-d],[1-d 1-d n+d n+d 1-d],[d d d d d],'y')\r\n        patch([1-d r+d r+d 1-d 1-d],[1-d 1-d r+d r+d 1-d],[d d d d d],'m')];\r\n   legend(s,{'C','R',' W'}, 'position',[.75 .62 .12 .12]);\r\n   \r\n%%\r\n% Plots of |C| and |R| do not easily reveal the fact that they contain\r\n% enough information to reconstruct the entire surface |P|.\r\n\r\n   subplot(2,1,1)\r\n   plot(C,'.-','linewidth',1,'markersize',12)\r\n   title('C')\r\n   \r\n   subplot(2,1,2)\r\n   plot(R','.-','linewidth',1,'markersize',12)\r\n   title('R')\r\n   \r\n%% peaks\r\n% The function |peaks| begins by generating matrices |x| and |y| that\r\n% sample a continuous real variable on the interval |[-3,3]|.  Setting\r\n% the meshsize |dx = 1\/8| leads to |n = 49|.  Smaller mesh sizes\r\n% lead to larger matrices, but they all have rank 3.\r\n\r\n   dx = 1\/8;\r\n   [x,y] = meshgrid(-3:dx:3);\r\n   \r\n%%\r\n% The core of |peaks| is this formula, which must be something like the\r\n% one that the Tektronix guys were using for their Mt. St. Helens\r\n% It is not obvious that the formula always generates a matrix of low rank.\r\n\r\n   z =  3*(1-x).^2.*exp(-(x.^2) - (y+1).^2) ...\r\n      - 10*(x\/5 - x.^3 - y.^5).*exp(-x.^2-y.^2) ...\r\n      - 1\/3*exp(-(x+1).^2 - y.^2);\r\n  \r\n%% Rank\r\n% The rest of this post is devoted to proving that |rank(z) = 3|.\r\n%\r\n% Here are two important facts about the rank of sums and pointwise products.\r\n%\r\n% * |rank(A + B) <= rank(A) + rank(B)|\r\n% * |rank(A.*B) <= min(rank(A),rank(B))|\r\n%\r\n% In particular, if A and B are both rank one, then \r\n%\r\n% * |rank(A + B) <= 2|\r\n% * |rank(A.*B) <= 1|\r\n%\r\n\r\n%% Reformulate\r\n% Let's factor out the exponentials using this function.\r\n\r\n   E = @(x,a) exp(-(x+a).^2);\r\n   \r\n%%\r\n% So, here is |z| again.\r\n\r\n   z =  3*(1-x).^2.*E(x,0).*E(y,1) ...\r\n      - 10*(x\/5 - x.^3 - y.^5).*E(x,0).*E(y,0) ...\r\n      - 1\/3.*E(x,1).*E(y,0); \r\n\r\n%%\r\n% Let |z1| be the first term.\r\n\r\n   z1 =  (3*(1-x).^2).*E(x,0).*E(y,1);\r\n   \r\n%%\r\n% |rank(z1) = 1| because |z1| is the pointwise product of three matrices.\r\n% There is no sum.\r\n   \r\n\r\n%%\r\n% Let\r\n\r\n   zx = -10*(x\/5 - x.^3).*E(x,0) - 1\/3.*E(x,1);\r\n   zy = (10*y.^5).*E(x,0);\r\n   \r\n%%\r\n% |rank(zx) = 1| because |zx| does not involve |y|.\r\n%\r\n% |rank(zy) = 1| because |zy| is a pointwise product.\r\n\r\n%%\r\n   \r\n   z2 =  (zx + zy).*E(y,0);\r\n   \r\n%%\r\n% |rank(z2) = (1 + 1)*1 = 2|\r\n\r\n   z = z1 + z2;\r\n  \r\n%%\r\n% |rank(z) = 1 + 2 = 3|\r\n\r\n%% Check\r\n% My original |P| is still in the workspace.\r\n\r\n  check = norm(P - z,inf)\r\n\r\n    \r\n\r\n##### SOURCE END ##### c8dfdcfa0fc94c559ece3ef8ba8cc56f\r\n-->","protected":false},"excerpt":{"rendered":"<div class=\"overview-image\"><img src=\"https:\/\/blogs.mathworks.com\/cleve\/files\/mt_st_helens.jpg\" class=\"img-responsive attachment-post-thumbnail size-post-thumbnail wp-post-image\" alt=\"\" decoding=\"async\" loading=\"lazy\" \/><\/div><!--introduction--><p>What do Mount St. Helens and the rank of a matrix have in common? The answer is the MATLAB function <tt>peaks<\/tt>.  Let me explain. Please bear with me -- it's a long story.... <a class=\"read-more\" href=\"https:\/\/blogs.mathworks.com\/cleve\/2021\/03\/22\/mount-st-helens-and-matrix-rank\/\">read more >><\/a><\/p>","protected":false},"author":78,"featured_media":6850,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[32,5,4,6],"tags":[],"_links":{"self":[{"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/posts\/6802"}],"collection":[{"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/users\/78"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/comments?post=6802"}],"version-history":[{"count":5,"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/posts\/6802\/revisions"}],"predecessor-version":[{"id":6854,"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/posts\/6802\/revisions\/6854"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/media\/6850"}],"wp:attachment":[{"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/media?parent=6802"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/categories?post=6802"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/tags?post=6802"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}