help-octave
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: update & matrix2latex re: implementing num2cell


From: Michael Creel
Subject: Re: update & matrix2latex re: implementing num2cell
Date: Tue, 25 Oct 2005 11:58:44 +0000
User-agent: Mozilla Thunderbird 1.0.7 (X11/20051013)

I missed the start of this thread, but I take it that you're interested in printing a matrix to a TeX table. The two attached functions may be of interest.
M.
## usage:  results2tex (betas, sterrs, file, cname, rname, prec, align, lines)
##
## Saves estimated coefficients and st. errors to LaTeX table file.
##
## betas and sterrs are KxM matrices of estimated coefficients
## and st. errors, where K is the number of coefs. and M is number
## of models. If some models do not contain all coefficient, the
## corresponding value of betas should be set to nan, and the
## standard error can be arbitrary (it won't be printed).
##
## cname and rname are matrices whose rows are the column
## respectively row headings, if c/rname == "" (default), no headings
## are printed.
##
## prec gives the number of digits printed after the
## comma. If prec<0 (default) the number is printed unformatted
##
## align gives the alignment of the data, default is "r" (flush right). If
##
## lines == 0 (default) or == "none", no lines are printed in the
## tabular; if lines == 2 or == "full" there are lines around each cell,
## otherwise there are lines at the border and between the headings and
## the data.
## Author:  Michael Creel <address@hidden>
## Based in part on save2tex.m, by Andreas Wei <address@hidden>
## Description:  Save to a file in a LaTeX tabular environment

# Example of usage that shows how missing elements are treated
# a = rand(3,4);
# b = rand(2,1);
# b = postpad(b,rows(a),nan);
# data = [b, a];
# sterr = rand(size(data));
# rname = str2mat("r1","r2","r3");
# cname = str2mat("c1","c2","c3","c4","c5");
# 
# results2tex(data, sterr, "test.tex", cname, rname, 5, "r", 1);

function results2tex(betas, sterrs, file, cname, rname, prec, align, lines)

        if ((nargin == 1) || (nargin > 8))
                printf("usage: save2tex (X, file, cname, rname, prec, align, 
lines)\n");
        endif

        if (nargin < 8) lines = 0; endif
        if (nargin < 7) align = "r"; endif  # center align seems to get decimals
        if (nargin < 6) prec = 4; endif
        if (nargin < 5) rname = ""; endif
        if (nargin < 4) cname = ""; endif


        if (isstr (lines))
                if (strcmp (lines, "full"))
                        lines = 2;
                elseif (strcmp (lines, "none"))
                        lines = 0;
                else
                        lines = 1;
                endif
        endif

        nr = rows(betas);
        nc = columns(betas);
        is_rn = columns(rname);
        is_cn = columns(cname);

        if ((is_rn) && (rows(rname) != nr))
                error ("results2tex: Numbers of rows and row names do not 
match.");
        endif
        
        if ((is_cn) && (rows(cname) != nc))
                error ("results2tex: Numbers of columns and column names do not 
match.");
        endif


        ### open output file
        FN = fopen (file, "w");
        if (FN < 0)
                error ("save2tex: Can not open File %s", file);
        endif

        ### create format line
        LSTR = "";
        LFSTR = "";
        if (lines)
                LSTR = "|";
                if (lines == 2)
                        LFSTR = "|";
                endif
        endif
        STR = ["\\begin{tabular}{", LSTR];
        if (is_rn)
                STR = [STR, "l", LSTR];
        endif
        
        for i=1:nc
                STR = [STR, align, LFSTR];
        endfor
        
        if (lines == 2)
                STR = [STR, "}\n"];
        else
                STR = [STR, LSTR, "}\n"];
        endif
        
        fprintf (FN, STR);
        
        if (lines)
                fprintf (FN, "\\hline\n");
        endif


        ### print column headers
        if (is_cn)
                if (is_rn)
                        STR = "  & ";
                else
                        STR = "  ";
                endif
                
                for i = 1:nc
                        STR = [STR, cname(i,:), " & "];
                endfor
                
                les=length(STR);
                fprintf(FN, [STR(1:les-2), "\\\\\n"]);
                
                if (lines)
                        fprintf (FN, "\\hline\n");
                endif
        endif

        test = abs(betas ./ sterrs);
        pvalue = 2*(1 - normal_cdf(test));
        
        ### print data
        for i = 1:nr
                STR = [rname(i,:), "  & "]; 
                STR2 = "  & "; # no row labels for st. errs or pvalues
                STR3 = STR2;
                nanform = sprintf(" %%s  & ");
                nanform2 = sprintf("\\small%%s & ");
                nanform3 = sprintf("\\small%%s & ");

                form = sprintf(" %%.%df  & ", prec);
                form2 = sprintf("\\small(%%.%df) & ", 3);
                form3 = sprintf("\\small[%%.%df] & ", 3);


                for j = 1:nc
                        if isnan(betas(i,j))
                                STR = [STR, sprintf(nanform,"na")]; 
                                STR2 = [STR2, sprintf(nanform2," ")];
                                STR3 = [STR3, sprintf(nanform3," ")];
                        else
                                STR = [STR, sprintf(form,betas(i,j))]; 
                                STR2 = [STR2, sprintf(form2,sterrs(i,j))];
                                STR3 = [STR3, sprintf(form3,pvalue(i,j))];
                        endif
                endfor

                les = length(STR);
                les2 = length(STR2);
                les3 = length(STR3);

                if (i < nr)
                        if (lines == 2)
                                fprintf(FN, [STR(1:les-2), "\\\\\n\\hline\n"]);
                                fprintf(FN, [STR2(1:les2-2), 
"\\\\\n\\hline\n"]);
                                fprintf(FN, [STR3(1:les3-2), 
"\\\\\n\\hline\n"]);
                        else 
                                fprintf(FN, [STR(1:les-2), "\\\\\n"]);
                                fprintf(FN, [STR2(1:les2-2), "\\\\\n"]);
                                fprintf(FN, [STR3(1:les3-2), "\\\\\n"]);
                        endif
                else
                        if (lines)
                                fprintf(FN, [STR(1:les-2),   "\\\\\n"]);
                                fprintf(FN, [STR2(1:les2-2),   "\\\\\n"]);
                                fprintf(FN, [STR3(1:les3-2), 
"\\\\\n\\hline\n"]);
                        else
                                fprintf(FN, [STR(1:les-2), "\\\\\n"]);
                                fprintf(FN, [STR2(1:les2-2), "\\\\\n"]);
                                fprintf(FN, [STR3(1:les3-2), "\n"]);            
                        endif
                endif
        endfor
        ### finish output
        fprintf(FN, "\\end{tabular}\n");
        fprintf(FN, "\n \\small ( )  = standard errors; [ ] = p-values\n");

        fclose(FN);
endfunction
## Copyright (C) 1996, 1997  Andreas Weingessel
## 
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 2, or (at your option)
## any later version.
## 
## This program is distributed in the hope that it will be useful, but
## WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
## General Public License for more details. 
## 
## You should have received a copy of the GNU General Public License
## along with this file.  If not, write to the Free Software Foundation,
## 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

## usage:  save2tex (X, file, cname, rname, prec, align, lines)
##
## Saves the data of the matrix X in a latex tabular environment to
## file. cname and rname are matrices whose rows are the column
## respectively row headings, if c/rname == "" (default), no headings
## are printed. prec gives the number of digits printed after the
## comma. If prec<0 (default) the number is printed unformatted. align
## gives the alignment of the data, default is "r" (flush right). If
## lines == 0 (default) or == "none", no lines are printed in the
## tabular; if lines == 2 or == "full" there are lines around each cell,
## otherwise there are lines at the border and between the headings and
## the data.

## Author:  AW <address@hidden>
## Description:  Save to a file in a LaTeX tabular environment

function save2tex(tabledata, file, cname, rname, prec, align, lines)

        if ((nargin == 1) || (nargin > 7))
                printf("usage: save2tex (X, file, cname, rname, prec, align, 
lines)\n");
        endif

        if (nargin < 7) lines = 0; endif
        if (nargin < 6) align = "r"; endif
        if (nargin < 5) prec = -1; endif
        if (nargin < 4) rname = ""; endif
        if (nargin < 3) cname = ""; endif

        if (isstr (lines))
                if (strcmp (lines, "full"))
                        lines = 2;
                elseif (strcmp (lines, "none"))
                        lines = 0;
                else
                        lines = 1;
                endif
        endif

        nr = rows(tabledata);
        nc = columns(tabledata);

        is_rn = columns(rname);
        is_cn = columns(cname);

        if ((is_rn) && (rows(rname) != nr))
                error ("save2tex: Numbers of rows and row names do not match.");
        endif

        if ((is_cn) && (rows(cname) != nc))
                error ("save2tex: Numbers of columns and column names do not 
match.");
        endif


        ### open output file
        FN = fopen (file, "w");
        if (FN < 0)
                error ("save2tex: Can not open File %s", file);
        endif

        ### create format line
        LSTR = "";
        LFSTR = "";
        if (lines)
                LSTR = "|";
                if (lines == 2)
                        LFSTR = "|";
                endif
        endif
        STR = ["\\begin{tabular}{", LSTR];
        if (is_rn)
                STR = [STR, "l", LSTR];
        endif

        for i=1:nc
                STR = [STR, align, LFSTR];
        endfor
        
        if (lines == 2)
                STR = [STR, "}\n"];
        else
                STR = [STR, LSTR, "}\n"];
        endif
        fprintf (FN, STR);
        
        if (lines)
                fprintf (FN, "\\hline\n");
        endif

        
        ### print column headers
        if (is_cn)
                if (is_rn)
                        STR = "  & ";
                else
                        STR = "  ";
                endif
                
                for i = 1:nc
                        STR = [STR, cname(i,:), " & "];
                endfor
                
                les=length(STR);
                fprintf(FN, [STR(1:les-2), "\\\\\n"]);
                
                if (lines)
                        fprintf (FN, "\\hline\n");
                endif
        endif

        ### print data
        for i = 1:nr
                if (is_rn)
                        STR = [rname(i,:), "  & "];
                else
                        STR = "  ";
                endif
                
                if (prec >= 0)
                        form = sprintf("%%.%df & ", prec);
                else
                        form = "%f & ";
                endif
                
                for j = 1:nc
                        STR = [STR, sprintf(form,tabledata(i,j))];
                endfor
                
                les=length(STR);
                
                if (i < nr)
                        if (lines == 2)
                                fprintf(FN, [STR(1:les-2), "\\\\\n\\hline\n"]);
                        else
                                fprintf(FN, [STR(1:les-2), "\\\\\n"]);
                        endif
                else
                        if (lines)
                                fprintf(FN, [STR(1:les-2), "\\\\\n\\hline\n"]);
                        else
                                fprintf(FN, [STR(1:les-2), "\n"]);
                        endif
                endif
        endfor
        
        ### finish output
        fprintf(FN, "\\end{tabular}\n");
        fclose(FN);

endfunction

reply via email to

[Prev in Thread] Current Thread [Next in Thread]