Snygga tabeller

Detta är ett ämna som man gräva ned sig i, men jag kommer bara att ge några enkla tips och inte en fullständig beskrivning.
Säg att vi har följande data, som vi vill presentera på ett snyggt sätt.
n
1
2
3
4
5
  x
0.1419
0.4218
0.9157
0.7922
0.9595
   y
103.4693
 72.6885
-30.3441
 29.3871
-78.7283
En variant är att skapa en matris som har n, x och y som kolonner.
>> [n, x, y]
ans =
    1.0000    0.1419  103.4693
    2.0000    0.4218   72.6885
    3.0000    0.9157  -30.3441
    4.0000    0.7922   29.3871
    5.0000    0.9595  -78.7283
För att slippa se ans utskrivet kan man använda disp-funktionen:
>> disp([n, x, y])
    1.0000    0.1419  103.4693
    2.0000    0.4218   72.6885
    3.0000    0.9157  -30.3441
    4.0000    0.7922   29.3871
    5.0000    0.9595  -78.7283
Låt oss multiplicera y(1) med 1000 så att det är större spridning på talens storleksordningar. Standardformatet fungerar då inte så bra:
>> disp([n, x, y])
   1.0e+05 *
    0.0000    0.0000    1.0347
    0.0000    0.0000    0.0007
    0.0000    0.0000   -0.0003
    0.0000    0.0000    0.0003
    0.0001    0.0000   -0.0008
Byter vi till format short e, ser vi i alla fall talen, men snyggt blir det inte
>> format short e
>> disp([n, x, y])
   1.0000e+00   1.4189e-01   1.0347e+05
   2.0000e+00   4.2176e-01   7.2689e+01
   3.0000e+00   9.1574e-01  -3.0344e+01
   4.0000e+00   7.9221e-01   2.9387e+01
   5.0000e+00   9.5949e-01  -7.8728e+01
Får att få detta snyggt får vi använda så kallade format (layout-beskrivningar) av talen i de tre kolonnerna. Vi vill ha heltalsformat i första kolonnen, format med decimaler men utan exponentdel i andra kolonnen och ett format med decimaler och exponentdel i tredje. Matlab har hämtat syntax för formatkoder från programspråket C, och det ser lite kryptiskt ut. Formatkoden %md anger att ett tal kommer att skrivas ut som ett heltal som upptar m positioner (fältvidden) i tabellen. De tal som skrivs ut med detta format skall ha en decimaldel som är noll. Formatkoden %m.nf skriver ut ett decimaltal med fältvidden m och n decimaler. %m.ne fungerar som föregående med den skillnaden att man får en exponentdel också. Dessa formatkoder förpackas i en sträng som utgör det första argumentet till fprint-funktionen. \n står slutligen för newline (ny rad). Så här kan det se ut:
>> fprintf('%3d%10.4f%15.4e\n', [n, x, y]')
  1    0.1419     1.0347e+05
  2    0.4218     7.2689e+01
  3    0.9157    -3.0344e+01
  4    0.7922     2.9387e+01
  5    0.9595    -7.8728e+01
Det är viktigt att inte glömma transponatet, ', efter matrisen [n, x, y]. fprintf läser element efter element från minnet. Matlab lagrar matriser kolonn efter kolonn i minnet och eftersom formatet beskriver en rad i matrisen, vill vi att fprintf skall läsa elementen i ordningen n(1), x(1), y(1), n(2), x(2), y(2) etc. Om vi glömmer transponatet kommer fprintf att läsa elementen i ordningen n(1), n(2), n(3), n(4), n(5), x(1) etc. och vi får fel utskrift.

Man kan göra formatsträngen lite tydligare genom att använda blanka, men observera att dessa räknas med (så vi får en extra blank mellan kolonnerna i detta fall, så man kompensera med att minska fältvidderna):
>> fprintf('%3d %10.4f %15.4e\n', [n, x, y]')
  1     0.1419      1.0347e+05
  2     0.4218      7.2689e+01
  3     0.9157     -3.0344e+01
  4     0.7922      2.9387e+01
  5     0.9595     -7.8728e+01
Vi vill kanske ha en rubrik över tabellen också. Det enklaste att skriva den separat. Säg vi har ett program som innehåller raderna:
fprintf('  n        x             y\n -----------------------------\n')
fprintf('%3d %10.2f %15.2e\n', [n, x, y]')  
Detta ger utskriften
  n        x             y
 -----------------------------
  1       0.14        1.03e+05
  2       0.42        7.27e+01
  3       0.92       -3.03e+01
  4       0.79        2.94e+01
  5       0.96       -7.87e+01
Mer detaljer och alternativ finns i den stora hjälpen för fprintf (ge alternativt kommandot doc fprintf).

Back