TransWikia.com

importing .txt file from Matlab to latex

TeX - LaTeX Asked on May 22, 2021

I’m trying to plot the modified Bessel functions using latex, so i tried the following
I generated the following .txt file in Matlab

z = linspace(0,20);
scale = 1;
Ks = zeros(4,100);
for nu = 0:3
  Ks(nu+1,:) = besselk(nu,z,scale);
end

save('data','Ks','z') 

and then I tried the following in latex

documentclass{standalone}

usepackage{pgfplots}
usepackage{pgfplotstable}
pgfplotsset{compat=1.10}

pgfplotstableread{
include{Data}
}datatable

begin{document}
begin{tikzpicture}
begin{axis}
addplot table  {datatable}
;

end{axis}
end{tikzpicture}
end{document}

but I’m not getting an output.

One Answer

You're doing a couple of things wrong. First of all, the save function in Matlab saves a binary .mat file unless you specify otherwise, and pgpflotstableread can't read .mat files. You need to add the -ascii option, or use dlmwrite, fprintf or some other function that will write data to text files.

Next, you're not supposed to use include inside pgfplotstableread, but add the filename directly, i.e. pgfplotstableread{filename.txt} (The extension doesn't have to be .txt.) By default pgfplotstableread assumes that columns in the text file are delimited by spaces, if you're using a different column separator you have to specify that, e.g. pgfplotstableread[col sep=comma]{...} if commas are used.

Finally, you probably have to choose which columns to plot. When you do addplot table {datatable};, pgfplots will use the first column for the x-values and the second column for the y-values. To plot multiple columns, you need multiple addplots, e.g.

addplot table[x index=0, y index=1] {datatable};
addplot table[x index=0, y index=2] {datatable};

If the columns are named, you can use e.g. x=NameOfXColumn instead of x index=0.


Working example follows. I used Octave via OctaveOnline, but I think the code would be the same in Matlab.

z = linspace(0,20);
scale = 1;
Ks = zeros(4,100);
for nu = 0:3
  Ks(nu+1,:) = besselk(nu,z,scale);
end

% Put both variables in one matrix
% transpose them to make the data column oriented - the dimensions of dataOut is 100 x 5
dataOut = [z' Ks'];

% save the new matrix using the `-ascii` option
save('data.dat','dataOut', '-ascii') 

The LaTeX code:

documentclass{standalone}

usepackage{pgfplotstable}
pgfplotsset{compat=1.10}

% add file name directly, no input or include
pgfplotstableread{data.dat}datatable

begin{document}
begin{tikzpicture}
begin{axis}[ymode=log]
addplot table {datatable};
addplot table[y index=1] {datatable};
addplot table[y index=2] {datatable};
addplot table[y index=3] {datatable};
addplot table[y index=4] {datatable};

legend{$nu=0$, $nu=1$, $nu=2$, $nu=3$}

end{axis}
end{tikzpicture}
end{document}

enter image description here

Correct answer by Torbjørn T. on May 22, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP