从 Matlab 2016 导入到 Mathematica 11 的数据格式比 .mat v7.3 更好?

Better dataformat than .mat v7.3 for import from Matlab 2016 to Mathematica 11?

我正在尝试使用本地存储将数据从 Matlab 2016a/2016b-prerelease 导入到 Mathematica 11

数据和质量保证

步数

  1. 指定任何测试数据(呈现二维图像),并指定 .tif 和数据文件的文件名
  2. .tif格式的图质量保证
  3. 以您选择的数据格式存储数据
  4. 您可以将数据文件重新加载回 Matlab 的质量保证
  5. 在 Mathematica 中导入数据文件
  6. Open/process Mathematica 中的数据文件

微分解

  1. Matlab v7.3 的挑战

  2. 自动方法的挑战

    • 我认为不适合,因为我想要本地存储等 here
  3. Matlab 的 v7 .mat 已弃用 v7.3

  4. Matlab 的 v5 和 v4 .mat - 我认为反对 v7.3

我对差异条件 (1) 的工作流程的尝试

一些规范:指定数据文件为v7.3的.mat文件

尝试 1

读取 Mathematica 中的数据,其中 Flatten 用于删除一组大括号,因为一组太多

(*  *)
SetDirectory["Desktop"]
a = Import["m.mat"] ;
(* https://mathematica.stackexchange.com/a/97252/9815 *)
a=Partition[Flatten[a], 5000]

(* Output fails: {} *)

学习agentp的

他只是简单地使用了一个方阵。 我有三个变量的数据:timepotentialC,拟合 imagesc() 的参数。

  1. 做向量 time m x 1 和 potential n x 1 的方阵。如何应用向量C在方阵A?我对这里的数学理解不够,无法自己回答这个问题。

    # time's dimensions m x 1
    # (potential')'s dimensions 1 x n
    time=0:0.001:1; potential=sin(time); A = time' * potential;
    # Output: A is m x n matrix, which is as as expected. 
    
    # C is vector 1 x m here. 
    C = spectrogram(potential); C=reshape(C,1,[]); C=nthroot( abs( C(1,1:1001) ), 1); 
    
  2. 如何将方阵 A(C) 转换回这三个变量? - - A(C)是关于方阵的,其中向量C已经应用于方阵A。我不明白创造结果背后的数学原理。

  3. 如何将这些数据作为一个二进制文件分开? - - 这可能不可能,但我想了解目前的标准。

Matlab:2016a、2016b 预发布
数学:11
OS:Debian 8.5
相关:Is there a way to import the results or data from Matlab to Mathematica automatically?

从 matlab 到 mathematica 的原始二进制文件交换示例:

matlab:

mat = [ pi 2*pi 3*pi ; 1 sqrt(2)  sqrt(3)  ]
f=fopen('out.bin','w')
fwrite(f,size(mat))
fwrite(f,mat,'double')
... # repeat for however many matrices we need to write
fwrite(f,size(mat2))
fwrite(f,mat2,'double')
...
fclose(f)

数学:

f = OpenRead["out.bin",   BinaryFormat -> True];
size = BinaryReadList[f, "Integer8", 2];
mat = Transpose@ArrayReshape[
         BinaryReadList[f, "Real64",Times@@size],
         Reverse@size];
(* repeat as needed to read multiple matrices *)
Close[f];
MatrixForm@mat

请注意 ReverseTranspose 是必需的,因为 matlab 按列主要顺序写入数据。您可以在写作时交替执行 fwrite(f,transpose(mat),'double')

另请注意,这假定了一个方形数组。如果你想处理多维数组,你还需要将 length(size) 写入文件等等。

为了完整起见,像这样回去:

f = OpenWrite["out.bin",  BinaryFormat -> True];
BinaryWrite[f, Dimensions[mat], "Integer8"];
BinaryWrite[f, Transpose[mat], "Real64"];
Close[f]

..

f=fopen('out.bin','r')
sz=transpose(fread(f,2))
mat=fread(f,sz,'double')
fclose(f)