在Python中使用loadmat加载.mat和.m文件

时间:2017-08-05 18:33:55

标签: matlab python-3.x loading

我目前正在学习神经网络课程,我正在尝试使用.mat从Python加载scipy.io.loadmat(filename)文件,但我不断收到以下错误消息:

  

ValueError:未知的mat文件类型,版本101,58

当我尝试使用.mat加载.m文件而不是scipy.io.loadmat()文件时,会出现相同的消息。

我不知道如何解决这个问题,所以如果有人在这里帮助我,我真的很感激。

4 个答案:

答案 0 :(得分:1)

(将我的评论转换成答案)

.m文件是matlab / octave脚本。你没有加载"一个脚本。甚至没有在matlab / octave中。您只能运行它,这可能会也可能不会产生特定的工作区,然后您可以将其保存到.mat文件中。

有" matlab接口"用于python,你可以用来在python会话中运行.m文件,例如官方MATLAB Engine API for Python,或者如果你有一个较旧的matlab版本,你可以尝试在线查找其他python matlab界面(一个简单的谷歌搜索给了我pymatlabmlabmlabwrap等)。如果您的.m文件是八度兼容的(并且您安装了八度),您还可以尝试已知可以正常工作的oct2py接口。一旦安装了其中一个接口,就可以尝试运行脚本,然后将工作区变量传输到python,或者使用接口保存到.mat文件,然后使用scipy.io.loadmat将其加载回python。照常。

至于.mat文件给你一个错误,最可能的原因是它是.mat规范的新版本,python还没有认识到(你是什么matlab版本)使用?)。尝试在matlab(或octave)中加载.mat文件并使用-v7选项再次保存。然后Python应该没有问题地打开它。

编辑:以下是通过oct2py运行八度音阶脚本的示例,将生成的八度音阶工作区保存到.mat文件中,并将.mat文件加载到蟒。

%% file myscript.m located at /home/tasos/Desktop
a = 1
b = 2
c = 3
# from python:
from oct2py import octave as oct
oct.eval("cd /home/tasos/Desktop")
oct.eval("myscript")
oct.eval("save -v7 myworkspace.mat")

from scipy.io import loadmat
D = loadmat("/home/tasos/Desktop/myworkspace.mat")
print D.keys() 
#>>> ['a', 'c', 'b', '__header__', '__globals__', 'ans', '__version__']
print D['a'], D['b'], D['c']
#>>> [[ 1.]] [[ 2.]] [[ 3.]]

答案 1 :(得分:0)

您无法加载public partial class Form1 : Form { static int x1,y1,x2,y2, x3, y3;//for the 3th particule private void timer1_Tick_1(object sender, EventArgs e) {Moveu(); Invalidate(); } private void button1_Click_1(object sender, EventArgs e) { timer1.Enabled = !timer1.Enabled; } public Form1() { InitializeComponent(); Paint += new PaintEventHandler(paint); MouseDown += new MouseEventHandler(mouse_Click); MouseUp += new MouseEventHandler(mouse_up); MouseMove += new MouseEventHandler(mouse_move); // x y z vx vy vz m particles[0] = new Particle( 0, 0, 0, 0, 0, 0, 1 ) ; //sun particles[1] = new Particle( 1, 0, 0, 0, 6, 0, 0.03 ); //earth // particles[2] = new Particle( 0, 2, 0, 0, 0, 0, 1 ); //planet x1 = (int)(100 * particles[0].r[0] + 300); y1 = (int)(100 * particles[0].r[1] + 300); x2 = (int)(100 * particles[1].r[0] + 300); y2 = (int)(100 * particles[1].r[1] + 300); } Particle[] particles = new Particle[2]; void Moveu() { double h, t; // setting initial values, step size and max time tmax h = 0.005; // the step size in years // initial time t = 0; //updates position of --all-- particles ( z=0 not z=1 ) for (int z = 0; z < particles.Length; z++) particles[z].RungeKutta4(particles, t, h, z); x1 = (int)(100 * particles[0].r[0] + 300); // +300 just for render it in centre y1 = (int)(100 * particles[0].r[1] + 300); x2 = (int)(100 * particles[1].r[0] + 300); y2 = (int)(100 * particles[1].r[1] + 300); // x3 = (int)(100 * particles[2].r[0] + 300); // y3 = (int)(100 * particles[2].r[1] + 300); } void paint(object s, PaintEventArgs e) { Graphics graf; graf = CreateGraphics(); graf.FillEllipse(new SolidBrush(Color.AntiqueWhite), x1 + move.X, y1 + move.Y, 50, 50); graf.FillEllipse(new SolidBrush(Color.Blue), x2 + move.X, y2 + move.Y, 10, 10); // graf.FillEllipse(new SolidBrush(Color.Yellow), x3, y3, 20, 20); } class Particle { public double[] r; // position vector public double[] v; // velocity vector public double mass; //constructor public Particle() { } public Particle(double x, double y, double z, double vx, double vy, double vz, double m) { this.r = new double[3]; this.v = new double[3]; this.r[0] = x; this.r[1] = y; this.r[2] = z; this.v[0] = vx; this.v[1] = vy; this.v[2] = vz; this.mass = m; } private double acc(double r, Particle[] particles, int particleNumber, double[] r_temp, int l) { // dv/dt = f(x) = -G * m_i * (x - x_i) / [(x - x_i)^2 + (y - y_i)^2 + (z - z_i)^2]^(3/2) double sum = 0; switch (l) { case 0: for (int i = 0; i < particles.Length; i++) if (i != particleNumber) sum += particles[i].mass * (r - particles[i].r[l]) / Math.Pow(Math.Pow(r - particles[i].r[l], 2) + Math.Pow(r_temp[1] - particles[i].r[1], 2) + Math.Pow(r_temp[2] - particles[i].r[2], 2), 1.5); break; case 1: for (int i = 0; i < particles.Length; i++) if (i != particleNumber) sum += particles[i].mass * (r - particles[i].r[l]) / Math.Pow(Math.Pow(r - particles[i].r[l], 2) + Math.Pow(r_temp[0] - particles[i].r[0], 2) + Math.Pow(r_temp[2] - particles[i].r[2], 2), 1.5); break; case 2: for (int i = 0; i < particles.Length; i++) if (i != particleNumber) sum += particles[i].mass * (r - particles[i].r[l]) / Math.Pow(Math.Pow(r - particles[i].r[l], 2) + Math.Pow(r_temp[0] - particles[i].r[0], 2) + Math.Pow(r_temp[1] - particles[i].r[1], 2), 1.5); break; } return -G * sum; } public void RungeKutta4(Particle[] particles, double t, double h, int particleNumber) { //current position of the particle is saved in a vector double[] r_temp = new double[3]; for (int j = 0; j < 3; j++) r_temp[j] = this.r[j]; //loop going over all the coordinates and updating each using RK4 algorithm for (int l = 0; l < 3; l++) { double[,] k = new double[4, 2]; k[0, 0] = this.v[l]; //k1_r k[0, 1] = acc(this.r[l], particles, particleNumber, r_temp, l); //k1_v k[1, 0] = this.v[l] + k[0, 1] * 0.5 * h; //k2_r k[1, 1] = acc(this.r[l] + k[0, 0] * 0.5 * h, particles, particleNumber, r_temp, l); //k2_v k[2, 0] = this.v[l] + k[1, 1] * 0.5 * h; //k3_r k[2, 1] = acc(this.r[l] + k[1, 0] * 0.5 * h, particles, particleNumber, r_temp, l); //k3_v k[3, 0] = this.v[l] + k[2, 1] * h; //k4_r k[3, 1] = acc(this.r[l] + k[2, 0] * h, particles, particleNumber, r_temp, l); //k4_v this.r[l] += (h / 6.0) * (k[0, 0] + 2 * k[1, 0] + 2 * k[2, 0] + k[3, 0]); this.v[l] += (h / 6.0) * (k[0, 1] + 2 * k[1, 1] + 2 * k[2, 1] + k[3, 1]); } } } public static double G = 4 * Math.PI * Math.PI; //then time unite in years and length unite = distance between Earth and Sun and masse is the sun masse unite void mouse_Click(object o, MouseEventArgs e) { dwn = new Point(e.X, e.Y); if ("" + e.Button == "Left") { pos = move; clicked = true; } } void mouse_move(object o, MouseEventArgs e) { if (clicked) { move = new Point(e.X + pos.X - dwn.X, e.Y + pos.Y - dwn.Y); Invalidate(); } } void mouse_up(object o, MouseEventArgs e) { clicked = false; } Point dwn, pos,move; bool clicked; }`you need to create a Timer and a button [![enter image description here][1]][1] 脚本文件。这些是MATLAB自己的脚本文件,它们包含MATLAB代码。函数.m无法解析此代码。

另一方面,该函数可以从MATLAB scipy.io.loadmat - 文件加载数据。这是MATLAB自己的数据格式,您可以在其中存储变量和数据 - 但不是代码。

参考:https://docs.scipy.org/doc/scipy/reference/generated/scipy.io.loadmat.html

答案 2 :(得分:0)

您可以使用MATLAB Engine API运行.m文件和MATLAB函数。它也可以加载.mat文件,但是可能有点慢。 https://www.mathworks.com/help/matlab/matlab-engine-for-python.html

答案 3 :(得分:0)

更容易的是使用以下方式加载数据:

numpy.loadtxt('your dot mat file')