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