JanKoWeb: Odborný SW - Matlab a LaTeX: rychlý export matice do LaTeXu

Matlab a LaTeX: rychlý export matice do LaTeXu

Praktický matlabí skriptík latex exportuje zadanou matici přímo do konzole a umožňuje tak rychle zkopírovat matici z Matlabu do LaTeXu. Je to mnohem rychlejší, než používat public či skripty jako latex2matlab, kde se musí vyplňovat název souboru, pak jej otevřít... Tady prostě zavoláte funkci, Ctrl+C a Ctrl+V a máte to v latexu.

Samozřejmě se jedná o m-file, takže si jej můžete poupravit k obrazu svému. Já třeba nepoužívám matice v matematickém režimu, takže jsem dal na řádce 39 prázdný mathstr, abych nemusel funkci volat s parametrem.

Příklad použití:

A = [1 2; 5 6];
latex(A)

Získáme v konzoli přímo:

1.0000 & 2.0000 \\
5.0000 & 6.0000 

Reference latex - File Exchange - MATLAB Central.

Pozor - Matlab sám obsahuje od roku 2005 funkci "latex", která ale umí zobrazit jen symbolický zápis. Umí jej ale i včetně zlomků.

Moje úprava

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.
%   Changes: JANKO, 2012/10/24

if ~isa(M,'double')
  error('Works only for arrays of numbers.')
elseif ndims(M) > 2
  error('Works only for 2D arrays.')
end

% start JANKO
if nargin < 2
  fmt = {'%g'}; % changed from %#.5g
  mathstr = ''; % changed from $
else
  fmt = varargin;
  idx = strmatch('nomath',fmt);
  if isempty(idx)
    mathstr = ''; % changed from $
  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) = '  ';

% start JANKO, inserted code
cc = '';
for i=1:size(M,2)
    cc = [cc 'c'];
end
S = [sprintf('\\left[\n\\begin{array}{') cc sprintf('}\n') S sprintf('\\end{array}\n\\right]')];
% end JANKO

% Display or output?
if nargout==0
  disp(S)
else
  s = S;
end

Shortcut

editor = matlab.desktop.editor.getActive;
% vezmeme vybrany text
selected = editor.SelectedText;
% spustime vybrany kus kodu
data = latex(eval(selected));
clipboard('copy', data);
Rubrika Odborný SW | Tagy Matlab, Latex | St 24.10.2012 | 1939x

Související články:

MATLAB: úprava popisku osy x (vydáno Po 13.03.2017, 12:16)
MATLAB: dávková úprava figure (vydáno Po 13.03.2017, 12:12)
MATLAB: divné chování keeplimits u dateaxis (vydáno Po 20.02.2017, 11:52)
MATLAB: otevření složky z MATLABu (vydáno Ne 05.07.2015, 10:23)
MATLAB: error attempt to add "" to a static workspace (vydáno Pá 03.07.2015, 10:23)
MATLAB: spuštění m-file na Linuxu přímo v MATLABu (vydáno So 27.06.2015, 10:23)
MATLAB help generator - File Exchange - MATLAB Central (vydáno Čt 11.06.2015, 10:23)
Matlab: zjištění závislostí a toolboxů dané funkce (vydáno Ne 26.10.2014, 16:13)
Matlab java.lang.OutOfMemoryError  (vydáno So 14.06.2014, 11:31)
Matlab: na Linuxu nejde změnit velikost fontu (vydáno Pá 27.12.2013, 18:55)
Matlab: generátor nápovědy pro funkce (vydáno Čt 31.10.2013, 16:51)
Matlab: tipy a triky pro práci se strukturami (vydáno Út 13.08.2013, 13:53)
Matlab: práce s error, warning a try catch (vydáno Po 05.08.2013, 13:48)
Matlab: prohlížeč obrázků (vydáno Čt 01.08.2013, 22:23)
Matlab: skrytí warning (vydáno Čt 18.07.2013, 14:59)
MATLAB: vícenásobná substituce proměnné v matici (vydáno Út 12.03.2013, 12:46)
Matlab a LaTeX: rychlý export matice do LaTeXu (vydáno St 24.10.2012, 10:12) - právě čtete
Matlab: praktické tipy pro práci s figurami (grafy) (vydáno St 14.12.2011, 10:30)
Matlab: praktické rady pro ladění kódu aneb Debug mode (vydáno Ne 11.12.2011, 19:24)
Matlab: zkratky pro často se opakující příkazy přímo v toolbaru (vydáno Ne 20.11.2011, 18:32)
Matlab: převod výrazu do formátu LaTeXu (vydáno Út 17.05.2011, 23:12)
Matlab: Vigenerova šifra (vydáno Pá 15.04.2011, 10:44)
Matlab: instalace na Linuxu UBUNTU (vydáno Pá 25.02.2011, 18:03)
Matlab: úpravy výrazů (vydáno St 23.02.2011, 18:03)
Matlab: export grafu do pdf (vydáno So 05.02.2011, 23:58)
Matlab: TODO, FIXME a cell mode (vydáno Pá 10.12.2010, 17:36)
Matlab: defaultní nastavení grafu (vydáno Út 16.11.2010, 12:31)
Matlab: přehled exportů grafického výstupu (vydáno Pá 09.07.2010, 16:37)
Matlab - funkce pro textový výstup (vydáno So 13.03.2010, 19:39)
Matlab - práce s řetězci (vydáno Čt 22.10.2009, 17:03)

Náhodné články

Tento web jsem zakládal na střední, v roce 2008. Je zde hlavně archiv mé tvorby.

Aktuální věci publikuji kvůli úspoře času na Twitter.

Honza

"Bezpečí je většinou pověra. Ve skutečnosti neexistuje. Život je buď odvážné dobrodružství, nebo vůbec nic."

H. Kellerová