Mercurial > hg > camir-aes2014
diff core/tools/matrix2latex.m @ 0:e9a9cd732c1e tip
first hg version after svn
author | wolffd |
---|---|
date | Tue, 10 Feb 2015 15:05:51 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/tools/matrix2latex.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,133 @@ +function s = latex(M,varargin) +%LATEX Print a matrix in LaTeX tabular format. +% LATEX(M) prints out the numeric matrix M in a LaTeX tabular +% format. The '&' character appears between entries in a row, '\\' +% is appended to the ends of rows, and each entry is set in math +% mode. Complex numbers are understood, and exponentials will be +% converted to a suitable format. +% +% LATEX(M,'nomath') does not include the $$ needed to put each +% entry in math mode (e.g., for use with the amsmath matrix modes). +% +% LATEX(M,FMT) uses a format specifier FMT of the SPRINTF type for +% each entry. +% +% LATEX(M,FMT1,FMT2,...) works through the given format specifiers +% on each row of M. If fewer are given than the column size of M, +% the last is used repeatedly for the rest of the row. +% +% S = LATEX(M,...) does not display output but returns a character +% array S. +% +% Examples: +% latex( magic(4) ) +% latex( magic(4), '%i', 'nomath' ) +% latex( magic(4), '%i', '%.2f' ) +% +% See also SPRINTF, SYM/LATEX. + +% Copyright 2002 by Toby Driscoll. Last updated 12/06/02. + +if ~isa(M,'double') + error('Works only for arrays of numbers.') +elseif ndims(M) > 2 + error('Works only for 2D arrays.') +end + +if nargin < 2 + fmt = {'%#.5g'}; + mathstr = '$'; +else + fmt = varargin; + idx = strmatch('nomath',fmt); + if isempty(idx) + mathstr = '$'; + else + mathstr = ''; + fmt = fmt([1:idx-1 idx+1:end]); + if isempty(fmt), fmt = {'%#.5g'}; end + end +end + +% Extend the format specifiers. +[m,n] = size(M); +if n > length(fmt) + [fmt{end:n}] = deal(fmt{end}); +end + +% Create one format for a row. +rowfmt = ''; +for p = 1:n + % Remove blanks. + thisfmt = deblank(fmt{p}); + + % Add on imaginary part if needed. + if ~isreal(M(:,p)) + % Use the same format as for the real part, but force a + sign for + % positive numbers. + ifmt = thisfmt; + j = findstr(ifmt,'%'); + if ~any(strcmp(ifmt(j+1),['-';'+';' ';'#'])) + ifmt = [ifmt(1:j) '+' ifmt(j+1:end)]; + else + ifmt(j+1) = '+'; + end + ifmt = [ifmt 'i']; + thisfmt = [thisfmt ifmt]; + end + + % Add to row. + rowfmt = [rowfmt mathstr thisfmt mathstr ' & ']; +end + +% After last column, remove column separator and put in newline. +rowfmt(end-1:end) = []; +rowfmt = [rowfmt '\\\\\n']; + +% Use it. +A = M.'; +if isreal(M) + S = sprintf(rowfmt,A); +else + S = sprintf(rowfmt,[real(A(:)) imag(A(:))].'); +end + +% Remove extraneous imaginary part for real entries. +if ~isreal(M) + zi = sprintf(ifmt,0); + S = strrep(S,zi,blanks(length(zi))); +end + +% Remove NaNs. +S = strrep(S,'$NaN$','--'); +S = strrep(S,'NaN','--'); + +% Convert 'e' exponents to LaTeX form. This is probably really slow, but +% what can you do without regular expressions? +S = strrep(S,'e','E'); +ex = min(findstr(S,'E')); +while ~isempty(ex) + % Find first non-digit character. Where is ISDIGIT? + j = ex+2; + while ~isempty(str2num(S(j))) & ~strcmp(S(j),'i') + j = j+1; + end + + % This strips off leading '+' and zeros. + num = sprintf('%i',str2num(S(ex+1:j-1))); + + ee = ['\times 10^{' num '}']; + S = [S(1:ex-1) ee S(j:end)]; + + ex = ex + min(findstr(S(ex+1:end),'E')); +end + +% For good form, remove that last '\\'. +S(end-2:end-1) = ' '; + +% Display or output? +if nargout==0 + disp(S) +else + s = S; +end