diff matrixcomp/treshape.m @ 0:8f23314345f4 draft

Create local repository for matrix toolboxes. Step #0 done.
author Antonio Pino Robles <data.script93@gmail.com>
date Wed, 06 May 2015 14:56:53 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/matrixcomp/treshape.m	Wed May 06 14:56:53 2015 +0200
@@ -0,0 +1,51 @@
+function T = treshape(x,unit)
+%TRESHAPE  Reshape vector to or from (unit) triangular matrix.
+%          TRESHAPE(X) returns a square upper triangular matrix whose
+%          elements are taken columnwise from the matrix X.
+%          TRESHAPE(X,1) returns a UNIT upper triangular matrix, and
+%          the 1s should not be specified in X.
+%          An error results if X does not have a number of elements of the form
+%          N*(N+1)/2 (or N less than this in the unit triangular case).
+%          X = TRESHAPE(R,2) is the inverse operation to R = TRESHAPE(X).
+%          X = TRESHAPE(R,3) is the inverse operation to R = TRESHAPE(X,1).
+
+if nargin == 1, unit = 0; end
+
+[p,q] = size(x);
+
+if unit < 2   % Convert vector x to upper triangular R.
+
+    m = p*q;
+    n = round( (-1 + sqrt(1+8*m))/2 );
+    if n*(n+1)/2 ~= m
+          error('Matrix must have a ''triangular'' number of elements.')
+    end
+
+    if unit == 1
+       n = n+1;
+    end
+
+    x = x(:);
+    T = unit*eye(n);
+
+    i = 1;
+    for j = 1+unit:n
+        T(1:j-unit,j) = x(i:i+j-1-unit);
+        i = i+j-unit;
+    end
+
+elseif unit >= 2   % Convert upper triangular R to vector x.
+
+   T = x;
+   if p ~= q, error('Must pass square matrix'), end
+   unit = unit - 2;
+   n = p*(p+1)/2 - unit*p;
+   x = zeros(n,1);
+   i = 1;
+   for j = 1+unit:p
+       x(i:i+j-1-unit) = T(1:j-unit,j);
+       i = i+j-unit;
+   end
+   T = x;
+
+end