Math.NET Numerics
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

197 lines
14 KiB

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>MATLAB Level-5 Mat Files
</title>
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="author" content="Christoph Ruegg, Marcus Cuda, Jurgen Van Gael">
<link rel="stylesheet" id="theme_link" href="https://cdnjs.cloudflare.com/ajax/libs/bootswatch/4.6.0/materia/bootstrap.min.css">
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/js/bootstrap.bundle.min.js" integrity="sha384-Piv4xVNRyMGpqkS2by6br4gNJ7DXjqk09RmUpJ8jgGtD7zP9yug3goQfGII0yAns" crossorigin="anonymous"></script>
<script type="text/javascript" async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/MathJax.js?config=TeX-MML-AM_CHTML"></script>
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
<link type="text/css" rel="stylesheet" href="https://numerics.mathdotnet.com/content/navbar-fixed-left.css" />
<link type="text/css" rel="stylesheet" href="https://numerics.mathdotnet.com/content/fsdocs-default.css" />
<link type="text/css" rel="stylesheet" href="https://numerics.mathdotnet.com/content/fsdocs-custom.css" />
<script type="text/javascript" src="https://numerics.mathdotnet.com/content/fsdocs-tips.js"></script>
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<!-- BEGIN SEARCH BOX: this adds support for the search box -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/JavaScript-autoComplete/1.0.4/auto-complete.css" />
<!-- END SEARCH BOX: this adds support for the search box -->
</head>
<body>
<nav class="navbar navbar-expand-md navbar-light bg-secondary fixed-left" id="fsdocs-nav">
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarsExampleDefault" aria-controls="navbarsExampleDefault" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse navbar-nav-scroll" id="navbarsExampleDefault">
<a href="https://numerics.mathdotnet.com/"><img id="fsdocs-logo" src="/logo.png" /></a>
<!-- BEGIN SEARCH BOX: this adds support for the search box -->
<div id="header">
<div class="searchbox" id="fsdocs-searchbox">
<label for="search-by">
<i class="fas fa-search"></i>
</label>
<input data-search-input="" id="search-by" type="search" placeholder="Search..." />
<span data-search-clear="">
<i class="fas fa-times"></i>
</span>
</div>
</div>
<!-- END SEARCH BOX: this adds support for the search box -->
<ul class="navbar-nav">
<li class="nav-header">Math.NET Numerics</li>
<li class="nav-item"><a class="nav-link" href="Packages.html">NuGet & Binaries</a></li>
<li class="nav-item"><a class="nav-link" href="ReleaseNotes.html">Release Notes</a></li>
<li class="nav-item"><a class="nav-link" href="https://github.com/mathnet/mathnet-numerics/blob/master/LICENSE.md">MIT License</a></li>
<li class="nav-item"><a class="nav-link" href="Compatibility.html">Platform Support</a></li>
<li class="nav-item"><a class="nav-link" href="https://numerics.mathdotnet.com/api/">Class Reference</a></li>
<li class="nav-item"><a class="nav-link" href="https://github.com/mathnet/mathnet-numerics/issues">Issues & Bugs</a></li>
<li class="nav-item"><a class="nav-link" href="Users.html">Who is using Math.NET?</a></li>
<li class="nav-header">Contributing</li>
<li class="nav-item"><a class="nav-link" href="Contributors.html">Contributors</a></li>
<li class="nav-item"><a class="nav-link" href="Contributing.html">Contributing</a></li>
<li class="nav-item"><a class="nav-link" href="Build.html">Build & Tools</a></li>
<li class="nav-item"><a class="nav-link" href="https://github.com/mathnet/mathnet-numerics/discussions/categories/ideas">Your Ideas</a></li>
<li class="nav-header">Getting Help</li>
<li class="nav-item"><a class="nav-link" href="https://discuss.mathdotnet.com/c/numerics">Discuss</a></li>
<li class="nav-item"><a class="nav-link" href="https://stackoverflow.com/questions/tagged/mathdotnet">Stack Overflow</a></li>
<li class="nav-header">Getting Started</li>
<l class="nav-item"i><a class="nav-link" href="/">Getting started</a></li>
<li class="nav-item"><a class="nav-link" href="Constants.html">Constants</a></li>
<li class="nav-item"><a class="nav-link" href="Matrix.html">Matrices and Vectors</a></li>
<li class="nav-item"><a class="nav-link" href="Euclid.html">Euclid & Number Theory</a></li>
<li class="nav-item">Combinatorics</li>
<li class="nav-header">Evaluation</li>
<li class="nav-item"><a class="nav-link" href="Functions.html">Special Functions</a></li>
<li class="nav-item"><a class="nav-link" href="Integration.html">Integration</a></li>
<li class="nav-header">Statistics/Probability</li>
<li class="nav-item"><a class="nav-link" href="DescriptiveStatistics.html">Descriptive Statistics</a></li>
<li class="nav-item"><a class="nav-link" href="Probability.html">Probability Distributions</a></li>
<li class="nav-header">Generation</li>
<li class="nav-item"><a class="nav-link" href="Generate.html">Generating Data</a></li>
<li class="nav-item"><a class="nav-link" href="Random.html">Random Numbers</a></li>
<li class="nav-header">Solving Equations</li>
<li class="nav-item"><a class="nav-link" href="LinearEquations.html">Linear Equation Systems</a></li>
<li class="nav-header">Optimization</li>
<li class="nav-item"><a class="nav-link" href="Distance.html">Distance Metrics</a></li>
<li class="nav-header">Curve Fitting</li>
<li class="nav-item"><a class="nav-link" href="Regression.html">Regression</a></li>
<li class="nav-header">Native Providers</li>
<li class="nav-item"><a class="nav-link" href="MKL.html">Intel MKL</a></li>
<li class="nav-header">Working Together</li>
<li class="nav-item"><a class="nav-link" href="CSV.html">Delimited Text Files (CSV)</a></li>
<li class="nav-item"><a class="nav-link" href="MatrixMarket.html">NIST MatrixMarket</a></li>
<li class="nav-item"><a class="nav-link" href="MatlabFiles.html">MATLAB</a></li>
<li class="nav-item"><a class="nav-link" href="IFSharpNotebook.html">IF# Notebook</a></li>
</ul>
</div>
</nav>
<div class="container">
<div class="masthead">
<h3 class="muted">
<a href="https://numerics.mathdotnet.com">Math.NET Numerics</a> |
<a href="https://www.mathdotnet.com">Math.NET Project</a> |
<a href="https://github.com/mathnet/mathnet-numerics">GitHub</a>
</h3>
</div>
<hr />
<div class="container" id="fsdocs-content">
<h1><a name="MATLAB-Level-5-Mat-Files" class="anchor" href="#MATLAB-Level-5-Mat-Files">MATLAB Level-5 Mat Files</a></h1>
<p>Level-5 MATLAB Mat files are popular as binary file container for storing one or more matrices.
Math.NET Numerics provides basic support for such Mat files with the <strong>MathNet.Numerics.Data.Matlab</strong> package,
which is available on NuGet as separate package and not included in the basic distribution.</p>
<h2><a name="Reading-matrices-from-a-MATLAB-file" class="anchor" href="#Reading-matrices-from-a-MATLAB-file">Reading matrices from a MATLAB file</a></h2>
<p>The <code>MatlabReader</code> class provides static functions to list all matrices stored in a MAT file or stream,
and to read them individually as Math.NET matrices:</p>
<table class="pre"><tr><td class="snippet"><pre class="fssnip highlighted"><code lang="csharp"><span class="k">using</span> MathNet.Numerics.LinearAlgebra;
<span class="k">using</span> MathNet.Numerics.Data.Matlab;
<span class="c">// read the first matrix as double</span>
Matrix&lt;<span class="k">double</span>&gt; m <span class="o">=</span> MatlabReader.Read&lt;<span class="k">double</span>&gt;(<span class="s">"collection.mat"</span>);
<span class="c">// read a specific matrix named "vd":</span>
Matrix&lt;<span class="k">double</span>&gt; m <span class="o">=</span> MatlabReader.Read&lt;<span class="k">double</span>&gt;(<span class="s">"collection.mat"</span>, <span class="s">"vd"</span>);
<span class="c">// we can also choose to convert to a different type:</span>
Matrix&lt;Complex&gt; m <span class="o">=</span> MatlabReader.Read&lt;Complex&gt;(<span class="s">"collection.mat"</span>);
<span class="c">// read all matrices of a file by name into a dictionary</span>
Dictionary&lt;<span class="k">string</span>,Matrix&lt;<span class="k">double</span>&gt;<span class="o">&gt;</span> ms <span class="o">=</span>
MatlabReader.ReadAll&lt;<span class="k">double</span>&gt;(<span class="s">"collection.mat"</span>);
<span class="c">// read the matrices named "Ad" and "vd" into a dictionary</span>
<span class="k">var</span> ms <span class="o">=</span> MatlabReader.ReadAll&lt;<span class="k">double</span>&gt;(<span class="s">"collection.mat"</span>, <span class="s">"vd"</span>, <span class="s">"Ad"</span>);
</code></pre></td></tr></table>
<p>Alternatively the reader can list all matrices of a file into named data elements,
which can then be read into matrices individually. This is useful e.g. if we need to
read some of the matrices to a different type:</p>
<table class="pre"><tr><td class="snippet"><pre class="fssnip highlighted"><code lang="csharp">List&lt;MatlabMatrix&gt; ms <span class="o">=</span> MatlabReader.List(<span class="s">"collection.mat"</span>);
Matrix&lt;<span class="k">double</span>&gt; Ad <span class="o">=</span> MatlabReader.Unpack&lt;<span class="k">double</span>&gt;(ms.Find(m <span class="o">=</span><span class="o">&gt;</span> m.Name <span class="o">=</span><span class="o">=</span> <span class="s">"Ad"</span>));
Matrix&lt;<span class="k">float</span>&gt; vd <span class="o">=</span> MatlabReader.Unpack&lt;<span class="k">float</span>&gt;(ms.Find(m <span class="o">=</span><span class="o">&gt;</span> m.Name <span class="o">=</span><span class="o">=</span> <span class="s">"vd"</span>));
</code></pre></td></tr></table>
<h2><a name="Writing-matrices-to-a-MATLAB-file" class="anchor" href="#Writing-matrices-to-a-MATLAB-file">Writing matrices to a MATLAB file</a></h2>
<p>The dual to the reader above is the <code>MatlabWriter</code> class that can serialize matrices
to a MATLAB file or stream. Like the reader, the writer can use <code>MatlabMatrix</code> data elements
to compose packed matrices into a file. Each matrix has a name which must not contain spaces.</p>
<table class="pre"><tr><td class="snippet"><pre class="fssnip highlighted"><code lang="csharp"><span class="k">var</span> matrices <span class="o">=</span> <span class="k">new</span> List&lt;MatlabMatrix&gt;();
m.Add(MatlabWriter.Pack(myFirstMatrix, <span class="s">"m1"</span>);
m.Add(MatlabWriter.Pack(mySecondMatrix, <span class="s">"m2"</span>);
MatlabWrier.Store(<span class="s">"file.mat"</span>, matrices);
</code></pre></td></tr></table>
<p>But there are also direct routines if only a single matrix or matrices of all the same data type
are to be stored in a file:</p>
<table class="pre"><tr><td class="snippet"><pre class="fssnip highlighted"><code lang="csharp"><span class="c">// write a single matrix "myMatrix" and name it "m1".</span>
MatlabWriter.Write(<span class="s">"file.mat"</span>, myMatrix, <span class="s">"m1"</span>);
<span class="c">// write multiple matrices, from a list of matrices and a list of their names:</span>
MatlabWriter.Write(<span class="s">"file.mat"</span>, <span class="k">new</span>[] { m<span class="n">1</span>, m<span class="n">2</span> }, <span class="k">new</span>[] { <span class="s">"m1"</span>, <span class="s">"m2"</span> });
<span class="c">// write a dictionary of matrices:</span>
<span class="k">var</span> dict <span class="o">=</span> <span class="k">new</span> Dictionary&lt;<span class="k">string</span>, Matrix&lt;<span class="k">double</span>&gt;<span class="o">&gt;</span>();
dict.Add(<span class="s">"m1"</span>, m<span class="n">1</span>);
dict.Add(<span class="s">"m2"</span>, m<span class="n">2</span>);
MatlabWriter.Write(<span class="s">"file.mat"</span>, dict);
</code></pre></td></tr></table>
<h2><a name="Alternatives" class="anchor" href="#Alternatives">Alternatives</a></h2>
<p>The data extension packages also offer other ways to serialize a matrix to a text file.
Among others:</p>
<ul>
<li><a href="CSV.html">Delimited Text Files (CSV &amp; TSV)</a></li>
<li><a href="MatrixMarket.html">NIST MatrixMarket text files</a></li>
</ul>
</div>
<!-- BEGIN SEARCH BOX: this adds support for the search box -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/JavaScript-autoComplete/1.0.4/auto-complete.css" />
<script type="text/javascript">var fsdocs_search_baseurl = 'https://numerics.mathdotnet.com/';</script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/lunr.js/2.3.8/lunr.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/JavaScript-autoComplete/1.0.4/auto-complete.min.js"></script>
<script type="text/javascript" src="https://numerics.mathdotnet.com/content/fsdocs-search.js"></script>
<!-- END SEARCH BOX: this adds support for the search box -->
</div>
</body>
</html>