%r_string(hr): support to any hypermatrix of rationals 43/18443/2
Samuel GOUGEON [Thu, 11 Aug 2016 03:51:56 +0000 (05:51 +0200)]
Change-Id: I97abee67ecd83a98b1c1850ae42aa6880054f9ba

scilab/modules/overloading/macros/%r_string.sci

index 54f8e7c..0138e1d 100644 (file)
@@ -1,5 +1,5 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) INRIA
+// Copyright (C) 2016 - Samuel GOUGEON
 //
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
 //
 // For more information, see the COPYING file which you should have received
 // along with this program.
 
-function txt=%r_string(r)
-    N=string(r.num)
-    D=string(r.den)
-    ln=max(matrix(length(N),2,-1),"r")
-    ld=max(matrix(length(D),2,-1),"r")
-    l=max(ln,ld)
-    [m,n]=size(r.num);
-    S=emptystr(m,n)
-    for i=1:m*n
-        s=2*i-1:2*i
-        N(s)=part(" ",1:(l(i)-ln(i))/2)+N(s)
-        D(s)=part(" ",1:(l(i)-ld(i))/2)+D(s)
-        S(i) =part("-",ones(1,l(i)))
-    end
-    txt=emptystr(5*m,n);
-    txt(1:5:$,:)=N(1:2:$,:)
-    txt(2:5:$,:)=N(2:2:$,:)
-    txt(3:5:$,:)=S(1:$,:)
-    txt(4:5:$,:)=D(1:2:$,:)
-    txt(5:5:$,:)=D(2:2:$,:)
+function txt = %r_string(r)
+    // string output of any array of rationals, of any number of dimensions (even>2)
+    //
+    N = string(r.num(:))
+    D = string(r.den(:))
+    nr = size(r,"*")
+    i = 1:2:2*nr
+    lengthI = max([length(N(i)) length(D(i))],"c")
+    hruleMax = part("-",ones(1:max(lengthI)))
+    hrules = strncpy(emptystr(nr,1)+hruleMax,lengthI)
+    txt = emptystr(nr*5,1);
+    j = 1:5:5*nr
+    txt(j)   = N(i)    // Exponents of numerator
+    txt(j+1) = N(i+1)  // Coefficients of numerator
+    txt(j+2) = hrules  // -------------------------
+    txt(j+3) = D(i)    // Exponents of denominator
+    txt(j+4) = D(i+1)  // Coefficients of denominator
+
+    // Centering the shortest part num or den on the other:
+    // justify(,"c") can't be used on exponents rows due to their leading blanks
+    txt = matrix(txt,5,-1)
+    [lmin, irmin] = min(length(txt),"r")
+    [lmax, irmax] = max(length(txt),"r")
+    leftpaddlength = floor((lmax-lmin)/2)
+    hpaddMax = part(" ", ones(1:max(leftpaddlength)))
+    padding = strncpy(emptystr(1,nr)+hpaddMax, leftpaddlength)
+    k = irmin<3  //  columns are %T where the num is the shortest
+    txt(1,k)  = padding(k)  + txt(1,k)
+    txt(2,k)  = padding(k)  + txt(2,k)
+    txt(4,~k) = padding(~k) + txt(4,~k)
+    txt(5,~k) = padding(~k) + txt(5,~k)
+
+    // We reshape the result
+    s = size(r)
+    s(1) = -1
+    txt = matrix(txt,s)
 endfunction