{"id":6884,"date":"2021-04-28T20:13:13","date_gmt":"2021-04-29T00:13:13","guid":{"rendered":"https:\/\/blogs.mathworks.com\/cleve\/?p=6884"},"modified":"2021-04-29T09:23:02","modified_gmt":"2021-04-29T13:23:02","slug":"solving-commodious-linear-systems","status":"publish","type":"post","link":"https:\/\/blogs.mathworks.com\/cleve\/2021\/04\/28\/solving-commodious-linear-systems\/","title":{"rendered":"Solving Commodious Linear Systems"},"content":{"rendered":"\r\n\r\n<div class=\"content\"><!--introduction--><p>This is about linear systems with fewer equations than variables; <tt>A*x = b<\/tt> where the <tt>m<\/tt> -by- <tt>n<\/tt> matrix <tt>A<\/tt> has fewer rows that columns, so <tt>m &lt; n<\/tt> . I have always called such systems <i>wide<\/i> or <i>fat<\/i>, but this is not respectful. So I consulted the Merriam-Webster Thesaurus and found <a href=\"https:\/\/www.merriam-webster.com\/dictionary\/commodious#synonym-discussion\">commodious<\/a>.<\/p><p>This is also one my first posts to use the Live Editor&#8482;. Here is a <a href=\"https:\/\/blogs.mathworks.com\/cleve\/files\/commodious_blog.mlx\">a link<\/a> to the <tt>.mlx<\/tt> file.<\/p><!--\/introduction--><h3>Contents<\/h3><div><ul><li><a href=\"#883e5269-4903-40fa-a2e3-787cfbb5c5c3\">Commodious linear systems<\/a><\/li><li><a href=\"#df1ba1ec-b76a-4a91-8b0a-80e09806bf8a\">Generate examples<\/a><\/li><li><a href=\"#5f6e4e0c-b3fc-47e9-9d5d-11992c58e431\">Backslash<\/a><\/li><li><a href=\"#44bf0fe3-4635-4570-80f1-bace8f18cdac\">Pseudoinverse<\/a><\/li><li><a href=\"#a676a72a-cc13-4384-b67c-9f324d0a6fb4\">SVD<\/a><\/li><li><a href=\"#40af18e5-9800-428f-84cb-f0634012b95b\">Questions<\/a><\/li><li><a href=\"#4eb8ba0d-b0d0-4770-9dae-1c4889ca7aa3\">1.<\/a><\/li><li><a href=\"#573c94df-04eb-4332-83b3-2c28e2141ba5\">2.<\/a><\/li><li><a href=\"#d93b89b8-0a76-4b59-9ac7-4ff70d9a0df2\">3.<\/a><\/li><li><a href=\"#8305d9ae-5af1-4d83-93f3-3822dc17cacd\">4.<\/a><\/li><\/ul><\/div><h4>Commodious linear systems<a name=\"883e5269-4903-40fa-a2e3-787cfbb5c5c3\"><\/a><\/h4><p>Commodious linear systems with fewer rows than columns do not have unique solutions.  It is hard to compute something if you don't quite know what it is you're trying to compute.  You can pin down the solution by adding an additional condition: minimize its Euclidean or $\\ell_2$ norm.   This is the Moore-Penrose solution.  It is unique and has many other desirable properties.<\/p><p>But recent years have seen many situations where a different condition is desirable: minimize the number of nonzero components of the solution.  Such a solution is called <a href=\"https:\/\/en.wikipedia.org\/wiki\/Sparse_approximation\">sparse<\/a>. Actually minimizing the number of nonzero components is combinatorically difficult. (It is NP-hard.)  However, the MATLAB backslash operator produces a solution with at most <tt>m<\/tt> nonzero components.  This is often the minimum.<\/p><h4>Generate examples<a name=\"df1ba1ec-b76a-4a91-8b0a-80e09806bf8a\"><\/a><\/h4><p>Pick the dimensions.<\/p><pre class=\"codeinput\">   m = 3\r\n   n = 10\r\n<\/pre><pre class=\"codeoutput\">m =\r\n     3\r\nn =\r\n    10\r\n<\/pre><pre class=\"codeinput\">   assert(m &lt; n)\r\n   format <span class=\"string\">short<\/span>\r\n<\/pre><p>Generate an m-by-n matrix with random one-digit positive and negative integer entries. Every time this script is executed, a different <tt>A<\/tt> is created.<\/p><pre class=\"codeinput\">   A = randi(18,m,n) - 9\r\n<\/pre><pre class=\"codeoutput\">A =\r\n     0     2     7    -8     2    -4    -6     3     0     0\r\n     2     3    -7     6     7     3    -3     9    -3    -1\r\n     4     1     3    -8    -2    -7    -6     1    -8     5\r\n<\/pre><p>Generate a random right hand side with the same number of rows.<\/p><pre class=\"codeinput\">   b = randi(18,m,1) - 9\r\n<\/pre><pre class=\"codeoutput\">b =\r\n     5\r\n     0\r\n     6\r\n<\/pre><p>Save a copy of the rhs.<\/p><pre class=\"codeinput\">   b_copy = b;\r\n<\/pre><h4>Backslash<a name=\"5f6e4e0c-b3fc-47e9-9d5d-11992c58e431\"><\/a><\/h4><p>Use backslash to compute one of many possible solutions to A*x = b.<\/p><pre class=\"codeinput\">   x = A\\b\r\n<\/pre><pre class=\"codeoutput\">x =\r\n         0\r\n         0\r\n         0\r\n   -0.5195\r\n         0\r\n         0\r\n         0\r\n    0.2812\r\n   -0.1953\r\n         0\r\n<\/pre><p>This x is <i><b>sparse<\/b><\/i>; it has only m nonzero components.<\/p><p>How was x computed?   Compute the QR decomposition with column pivoting. That is A*P = Q*R with orthogonal Q, right trapezoidal R, and permutation P.<\/p><pre class=\"codeinput\">   [Q,R,P] = qr(A)\r\n<\/pre><pre class=\"codeoutput\">Q =\r\n   -0.6247   -0.4341   -0.6491\r\n    0.4685   -0.8734    0.1331\r\n   -0.6247   -0.2209    0.7490\r\nR =\r\n  Columns 1 through 7\r\n   12.8062    1.7179    3.5920   -1.5617    3.2796    8.2772    6.0908\r\n         0   -9.3834    4.3876   -2.6305   -6.5398    0.6628    6.5502\r\n         0         0   -6.3911    3.2621   -1.8641   -2.2469   -0.9986\r\n  Columns 8 through 10\r\n   -0.4685   -9.5266   -3.5920\r\n   -3.7092    2.4121   -0.2313\r\n   -0.1498   -3.2289    3.6117\r\nP =\r\n     0     0     0     1     0     0     0     0     0     0\r\n     0     0     0     0     0     0     0     1     0     0\r\n     0     0     0     0     0     0     0     0     1     0\r\n     1     0     0     0     0     0     0     0     0     0\r\n     0     0     0     0     1     0     0     0     0     0\r\n     0     0     0     0     0     1     0     0     0     0\r\n     0     0     0     0     0     0     1     0     0     0\r\n     0     1     0     0     0     0     0     0     0     0\r\n     0     0     1     0     0     0     0     0     0     0\r\n     0     0     0     0     0     0     0     0     0     1\r\n<\/pre><p>Keep only the first m columns of R.<\/p><pre class=\"codeinput\">   R = R(:,1:m)\r\n<\/pre><pre class=\"codeoutput\">R =\r\n   12.8062    1.7179    3.5920\r\n         0   -9.3834    4.3876\r\n         0         0   -6.3911\r\n<\/pre><p>Apply Q to right hand side.<\/p><pre class=\"codeinput\">   b = Q'*b\r\n<\/pre><pre class=\"codeoutput\">b =\r\n   -6.8716\r\n   -3.4960\r\n    1.2483\r\n<\/pre><p>Back substitution solves the square, triangular system R*x = b.<\/p><pre class=\"codeinput\">   x = R\\b\r\n<\/pre><pre class=\"codeoutput\">x =\r\n   -0.5195\r\n    0.2812\r\n   -0.1953\r\n<\/pre><p>Tack some zeros on the end of x, matching the number of columns deleted from R.<\/p><pre class=\"codeinput\">   x(m+1:n) = 0\r\n<\/pre><pre class=\"codeoutput\">x =\r\n   -0.5195\r\n    0.2812\r\n   -0.1953\r\n         0\r\n         0\r\n         0\r\n         0\r\n         0\r\n         0\r\n         0\r\n<\/pre><p>Undo the permutations.<\/p><pre class=\"codeinput\">   x = P*x\r\n<\/pre><pre class=\"codeoutput\">x =\r\n         0\r\n         0\r\n         0\r\n   -0.5195\r\n         0\r\n         0\r\n         0\r\n    0.2812\r\n   -0.1953\r\n         0\r\n<\/pre><h4>Pseudoinverse<a name=\"44bf0fe3-4635-4570-80f1-bace8f18cdac\"><\/a><\/h4><p>Restore the rhs.<\/p><pre class=\"codeinput\">   b = b_copy;\r\n<\/pre><p>For comparison, the minimum 2-norm solution can be obtained with the Moore-Penrose pseudoinverse.  This is usually completely full; none of its components are zero.<\/p><pre class=\"codeinput\">   y = pinv(A)*b\r\n<\/pre><pre class=\"codeoutput\">y =\r\n    0.0644\r\n    0.0655\r\n    0.1261\r\n   -0.2161\r\n    0.0475\r\n   -0.1481\r\n   -0.2034\r\n    0.1164\r\n   -0.1232\r\n    0.0612\r\n<\/pre><p>Both x and y are solutions to the original system.<\/p><pre class=\"codeinput\">   Ax = A*x\r\n   Ay = A*y\r\n<\/pre><pre class=\"codeoutput\">Ax =\r\n    5.0000\r\n    0.0000\r\n    6.0000\r\nAy =\r\n    5.0000\r\n   -0.0000\r\n    6.0000\r\n<\/pre><p>However <tt>norm(y,2)<\/tt> is less than norm(x,2).<\/p><pre class=\"codeinput\">   normyx = [norm(y) norm(x)]\r\n<\/pre><pre class=\"codeoutput\">normyx =\r\n    0.4112    0.6222\r\n<\/pre><h4>SVD<a name=\"a676a72a-cc13-4384-b67c-9f324d0a6fb4\"><\/a><\/h4><p>To compute y without computing the pseudoinverse, use the SVD.<\/p><pre class=\"codeinput\">   [U,S,V] = svd(A)\r\n<\/pre><pre class=\"codeoutput\">U =\r\n   -0.5601    0.2006   -0.8038\r\n    0.3872    0.9211   -0.0399\r\n   -0.7324    0.3336    0.5936\r\nS =\r\n  Columns 1 through 7\r\n   20.2128         0         0         0         0         0         0\r\n         0   15.1459         0         0         0         0         0\r\n         0         0    8.3091         0         0         0         0\r\n  Columns 8 through 10\r\n         0         0         0\r\n         0         0         0\r\n         0         0         0\r\nV =\r\n  Columns 1 through 7\r\n   -0.1066    0.2097    0.2761    0.5246    0.0327    0.4104    0.4231\r\n   -0.0342    0.2310   -0.1365   -0.2150   -0.5533   -0.1705    0.3003\r\n   -0.4368   -0.2670   -0.4292    0.4955   -0.0865    0.1040    0.1695\r\n    0.6265    0.0828    0.1735    0.5967   -0.1499   -0.2918   -0.1873\r\n    0.1511    0.4082   -0.3700   -0.0089    0.7338   -0.0647    0.1593\r\n    0.4219   -0.0247   -0.1275   -0.1803   -0.1248    0.8221   -0.0885\r\n    0.3262   -0.3940    0.1662   -0.1806    0.0969   -0.1350    0.7663\r\n    0.0530    0.6091   -0.2620   -0.0174   -0.2910   -0.0377    0.2134\r\n    0.2324   -0.3586   -0.5571    0.1057   -0.0492   -0.0517   -0.0236\r\n   -0.2003    0.0493    0.3620   -0.0193    0.1110    0.0645   -0.0210\r\n  Columns 8 through 10\r\n   -0.1425    0.4068   -0.2429\r\n   -0.6536    0.0165    0.1666\r\n    0.0216   -0.4643    0.2127\r\n   -0.0817   -0.1943    0.1656\r\n   -0.2858   -0.0944    0.1226\r\n   -0.0609   -0.2152    0.1524\r\n    0.1853   -0.1585    0.0614\r\n    0.6475    0.0133    0.0785\r\n    0.0450    0.6800    0.1605\r\n    0.0664    0.1951    0.8756\r\n<\/pre><p>Then, with appropriate parentheses, and with a backslash involving a diagonal matrix, finding the minimum norm solution is a one-liner, .<\/p><pre class=\"codeinput\">   y = V*(S\\(U'*b))\r\n<\/pre><pre class=\"codeoutput\">y =\r\n    0.0644\r\n    0.0655\r\n    0.1261\r\n   -0.2161\r\n    0.0475\r\n   -0.1481\r\n   -0.2034\r\n    0.1164\r\n   -0.1232\r\n    0.0612\r\n<\/pre><h4>Questions<a name=\"40af18e5-9800-428f-84cb-f0634012b95b\"><\/a><\/h4><p>There are lots of things that I don't know about commodious systems.<\/p><h4>1.<a name=\"4eb8ba0d-b0d0-4770-9dae-1c4889ca7aa3\"><\/a><\/h4><p>Is there a  bound on <tt>norm(x)\/norm(y)<\/tt>?<\/p><h4>2.<a name=\"573c94df-04eb-4332-83b3-2c28e2141ba5\"><\/a><\/h4><p>The condition number of <tt>A<\/tt> with respect to any norm could be defined by<\/p><p><tt>cond(A) = max(norm(A*x)\/norm(x))\/min(norm(A*x)\/norm(x))<\/tt><\/p><p>We know that for the 2-norm this is the ratio of singular values.  What about the 1-norm or the inf-norm?  How can we compute this?<\/p><h4>3.<a name=\"d93b89b8-0a76-4b59-9ac7-4ff70d9a0df2\"><\/a><\/h4><p>What can be proved about the residual and the error of the solution computed by backslash?  I suspect the residual is small, but what is the error when the solution is not unique?<\/p><h4>4.<a name=\"8305d9ae-5af1-4d83-93f3-3822dc17cacd\"><\/a><\/h4><p>What is this distribution?<\/p><pre class=\"codeinput\">   kmax = 10000;\r\n   kappa = zeros(kmax,1);\r\n   <span class=\"keyword\">for<\/span> k = 1:kmax\r\n       A = randi(18,m,n) - 9;\r\n       kappa(k) = cond(A);\r\n   <span class=\"keyword\">end<\/span>\r\n   histogram(kappa)\r\n   title(<span class=\"string\">'cond(A)'<\/span>)\r\n   ax = axis;\r\n   text(0.7*ax(2),0.8*ax(4),sprintf(<span class=\"string\">'m =  %2d, n = %2d'<\/span>,m,n))\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"http:\/\/blogs.mathworks.com\/cleve\/files\/commodious_blog_01.png\" alt=\"\"> <script language=\"JavaScript\"> <!-- \r\n    function grabCode_e5c1ff66c3d444c8b6d4401bacef47dc() {\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='e5c1ff66c3d444c8b6d4401bacef47dc ' + '##### ' + 'SOURCE BEGIN' + ' #####';\r\n        t2='##### ' + 'SOURCE END' + ' #####' + ' e5c1ff66c3d444c8b6d4401bacef47dc';\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_e5c1ff66c3d444c8b6d4401bacef47dc()\"><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; R2021a<br><\/p><\/div><!--\r\ne5c1ff66c3d444c8b6d4401bacef47dc ##### SOURCE BEGIN #####\r\n%% Solving Commodious Linear Systems\r\n% This is about linear systems with fewer equations than variables; |A*x = b| \r\n% where the |m| -by- |n| matrix |A| has fewer rows that columns, so |m < n| . \r\n% I have always called such systems _wide_ or _fat_, but this is not respectful. \r\n% So I consulted the Merriam-Webster Thesaurus and found\r\n% <https:\/\/www.merriam-webster.com\/dictionary\/commodious#synonym-discussion\r\n% commodious>.\r\n% \r\n% This is also one my first posts to use the Live Editor&#x2122;. Here is a \r\n% <https:\/\/blogs.mathworks.com\/cleve\/files\/commodious_blog.mlx \r\n% a link> to the |.mlx| file.\r\n%% Commodious linear systems\r\n% Commodious linear systems with fewer rows than columns do not have unique \r\n% solutions.  It is hard to compute something if you don't quite know what it \r\n% is you're trying to compute.  You can pin down the solution by adding an additional \r\n% condition: minimize its Euclidean or $\\ell_2$ norm.   This is the Moore-Penrose \r\n% solution.  It is unique and has many other desirable properties.\r\n% \r\n% But recent years have seen many situations where a different condition is \r\n% desirable: minimize the number of nonzero components of the solution.  Such \r\n% a solution is called <https:\/\/en.wikipedia.org\/wiki\/Sparse_approximation sparse>.  \r\n% Actually minimizing the number of nonzero components is combinatorically difficult.  \r\n% (It is NP-hard.)  However, the MATLAB backslash operator produces a solution \r\n% with at most |m| nonzero components.  This is often the minimum.\r\n%% Generate examples\r\n% Pick the dimensions.\r\n\r\n   m = 3\r\n   n = 10\r\n%%\r\n   assert(m < n)\r\n   format short\r\n%% \r\n% Generate an m-by-n matrix with random one-digit positive and negative integer \r\n% entries. Every time this script is executed, a different |A| is created.\r\n\r\n   A = randi(18,m,n) - 9\r\n%% \r\n% Generate a random right hand side with the same number of rows.\r\n\r\n   b = randi(18,m,1) - 9\r\n%% \r\n% Save a copy of the rhs.\r\n\r\n   b_copy = b; \r\n%% Backslash\r\n%% \r\n% Use backslash to compute one of many possible solutions to A*x = b.\r\n\r\n   x = A\\b \r\n%% \r\n% This x is _*sparse*_; it has only m nonzero components.\r\n%% \r\n% How was x computed?   Compute the QR decomposition with column pivoting.  \r\n% That is A*P = Q*R with orthogonal Q, right trapezoidal R, and permutation P.\r\n\r\n   [Q,R,P] = qr(A)   \r\n%% \r\n% Keep only the first m columns of R.\r\n\r\n   R = R(:,1:m)\r\n%% \r\n% Apply Q to right hand side.\r\n\r\n   b = Q'*b   \r\n%% \r\n% Back substitution solves the square, triangular system R*x = b.\r\n\r\n   x = R\\b  \r\n%% \r\n% Tack some zeros on the end of x, matching the number of columns deleted from \r\n% R. \r\n\r\n   x(m+1:n) = 0\r\n%% \r\n% Undo the permutations.  \r\n\r\n   x = P*x\r\n%% Pseudoinverse\r\n% Restore the rhs.\r\n\r\n   b = b_copy;\r\n%% \r\n% For comparison, the minimum 2-norm solution can be obtained with the Moore-Penrose \r\n% pseudoinverse.  This is usually completely full; none of its components are \r\n% zero.\r\n\r\n   y = pinv(A)*b   \r\n%% \r\n% Both x and y are solutions to the original system.\r\n\r\n   Ax = A*x\r\n   Ay = A*y\r\n%% \r\n% However |norm(y,2)| is less than norm(x,2).\r\n\r\n   normyx = [norm(y) norm(x)]\r\n%% SVD\r\n% To compute y without computing the pseudoinverse, use the SVD.\r\n\r\n   [U,S,V] = svd(A)   \r\n%% \r\n% Then, with appropriate parentheses, and with a backslash involving a diagonal \r\n% matrix, finding the minimum norm solution is a one-liner, .\r\n\r\n   y = V*(S\\(U'*b))\r\n%% Questions\r\n% There are lots of things that I don't know about commodious systems.\r\n%% 1.\r\n% Is there a  bound on |norm(x)\/norm(y)|?\r\n%% 2.\r\n% The condition number of |A| with respect to any norm could be defined by\r\n% \r\n% |cond(A) = max(norm(A*x)\/norm(x))\/min(norm(A*x)\/norm(x))|\r\n% \r\n% We know that for the 2-norm this is the ratio of singular values.  What about \r\n% the 1-norm or the inf-norm?  How can we compute this?\r\n%% 3.\r\n% What can be proved about the residual and the error of the solution computed \r\n% by backslash?  I suspect the residual is small, but what is the error when the \r\n% solution is not unique?\r\n%% 4.\r\n% What is this distribution?\r\n\r\n   kmax = 10000; \r\n   kappa = zeros(kmax,1); \r\n   for k = 1:kmax\r\n       A = randi(18,m,n) - 9; \r\n       kappa(k) = cond(A);\r\n   end \r\n   histogram(kappa)\r\n   title('cond(A)') \r\n   ax = axis;\r\n   text(0.7*ax(2),0.8*ax(4),sprintf('m =  %2d, n = %2d',m,n))\r\n##### SOURCE END ##### e5c1ff66c3d444c8b6d4401bacef47dc\r\n-->","protected":false},"excerpt":{"rendered":"<div class=\"overview-image\"><img src=\"https:\/\/blogs.mathworks.com\/cleve\/files\/commodious_blog_01.png\" class=\"img-responsive attachment-post-thumbnail size-post-thumbnail wp-post-image\" alt=\"\" decoding=\"async\" loading=\"lazy\" \/><\/div><!--introduction--><p>This is about linear systems with fewer equations than variables; <tt>A*x = b<\/tt> where the <tt>m<\/tt> -by- <tt>n<\/tt> matrix <tt>A<\/tt> has fewer rows that columns, so <tt>m &lt; n<\/tt> . I have always called such systems <i>wide<\/i> or <i>fat<\/i>, but this is not respectful. So I consulted the Merriam-Webster Thesaurus and found <a href=\"https:\/\/www.merriam-webster.com\/dictionary\/commodious#synonym-discussion\">commodious<\/a>.... <a class=\"read-more\" href=\"https:\/\/blogs.mathworks.com\/cleve\/2021\/04\/28\/solving-commodious-linear-systems\/\">read more >><\/a><\/p>","protected":false},"author":78,"featured_media":6912,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[6,16,37,30],"tags":[],"_links":{"self":[{"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/posts\/6884"}],"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=6884"}],"version-history":[{"count":9,"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/posts\/6884\/revisions"}],"predecessor-version":[{"id":6904,"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/posts\/6884\/revisions\/6904"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/media\/6912"}],"wp:attachment":[{"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/media?parent=6884"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/categories?post=6884"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/tags?post=6884"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}