csharpfftfsharpintegrationinterpolationlinear-algebramathdifferentiationmatrixnumericsrandomregressionstatisticsmathnet
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.
90 lines
3.2 KiB
90 lines
3.2 KiB
(*** hide ***)
|
|
#I "../../out/lib/net40"
|
|
#r "MathNet.Numerics.dll"
|
|
#r "MathNet.Numerics.FSharp.dll"
|
|
|
|
(**
|
|
MATLAB Level-5 Mat Files
|
|
========================
|
|
|
|
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 **MathNet.Numerics.Data.Matlab** package,
|
|
which is available on NuGet as separate package and not included in the basic distribution.
|
|
|
|
|
|
Reading matrices from a MATLAB file
|
|
-----------------------------------
|
|
|
|
The `MatlabReader` class provides static functions to list all matrices stored in a MAT file or stream,
|
|
and to read them individually as Math.NET matrices:
|
|
|
|
[lang=csharp]
|
|
using MathNet.Numerics.LinearAlgebra;
|
|
using MathNet.Numerics.Data.Matlab;
|
|
|
|
// read the first matrix as double
|
|
Matrix<double> m = MatlabReader.Read<double>("collection.mat");
|
|
|
|
// read a specific matrix named "vd":
|
|
Matrix<double> m = MatlabReader.Read<double>("collection.mat", "vd");
|
|
|
|
// we can also choose to convert to a different type:
|
|
Matrix<Complex> m = MatlabReader.Read<Complex>("collection.mat");
|
|
|
|
// read all matrices of a file by name into a dictionary
|
|
Dictionary<string,Matrix<double>> ms =
|
|
MatlabReader.ReadAll<double>("collection.mat");
|
|
|
|
// read the matrices named "Ad" and "vd" into a dictionary
|
|
var ms = MatlabReader.ReadAll<double>("collection.mat", "vd", "Ad");
|
|
|
|
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:
|
|
|
|
[lang=csharp]
|
|
List<MatlabMatrix> ms = MatlabReader.List("collection.mat");
|
|
Matrix<double> Ad = MatlabReader.Unpack<double>(ms.Find(m => m.Name == "Ad"));
|
|
Matrix<float> vd = MatlabReader.Unpack<float>(ms.Find(m => m.Name == "vd"));
|
|
|
|
|
|
Writing matrices to a MATLAB file
|
|
---------------------------------
|
|
|
|
The dual to the reader above is the `MatlabWriter` class that can serialize matrices
|
|
to a MATLAB file or stream. Like the reader, the writer can use `MatlabMatrix` data elements
|
|
to compose packed matrices into a file. Each matrix has a name which must not contain spaces.
|
|
|
|
[lang=csharp]
|
|
var matrices = new List<MatlabMatrix>();
|
|
m.Add(MatlabWriter.Pack(myFirstMatrix, "m1");
|
|
m.Add(MatlabWriter.Pack(mySecondMatrix, "m2");
|
|
MatlabWrier.Store("file.mat", matrices);
|
|
|
|
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:
|
|
|
|
[lang=csharp]
|
|
// write a single matrix "myMatrix" and name it "m1".
|
|
MatlabWriter.Write("file.mat", myMatrix, "m1");
|
|
|
|
// write multiple matrices, from a list of matrices and a list of their names:
|
|
MatlabWriter.Write("file.mat", new[] { m1, m2 }, new[] { "m1", "m2" });
|
|
|
|
// write a dictionary of matrices:
|
|
var dict = new Dictionary<string, Matrix<double>>();
|
|
dict.Add("m1", m1);
|
|
dict.Add("m2", m2);
|
|
MatlabWriter.Write("file.mat", dict);
|
|
|
|
|
|
Alternatives
|
|
------------
|
|
|
|
The data extension packages also offer other ways to serialize a matrix to a text file.
|
|
Among others:
|
|
|
|
* [Delimited Text Files (CSV & TSV)](CSV.html)
|
|
* [NIST MatrixMarket text files](MatrixMarket.html)
|
|
|
|
*)
|
|
|