【问题标题】:Better dataformat than .mat v7.3 for import from Matlab 2016 to Mathematica 11?从 Matlab 2016 导入到 Mathematica 11 的数据格式比 .mat v7.3 更好?
【发布时间】:2017-01-12 21:20:06
【问题描述】:

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

  • 最好的完整文档
  • 可扩展到大数据,如此二进制;现在,1-100 GB,但以后需要 TB
  • 从 Mathematica 11 转换到 Matlab 2016 - 如果数据格式可以是双射,也是一个优点;所以理解在 Matlab 2016a/b 和 Mathematica 11 中读取数据格式
  • ...

数据和质量保证

  • 完整数据是 x-y 平面,它有 650 000 x 650 000 个点,因此维度大约是方阵。
  • 以数据的任何子集等 6500 x 6500 作为示例。
  • 保存数据文件和 .tiff 图像。

步骤

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

差异化解决方案

  1. Matlab v7.3 面临的挑战

  2. 自动方法的挑战

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

  4. Matlab 的 v5 和 v4 .mat - 我认为已弃用 v7.3

我对 Diff Condition 工作流程的尝试(一)

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

尝试 1

  • Matlab

    # Specify test data here
    time=0:0.001:1; potential=sin(time); C = spectrogram(potential); C=reshape(C,1,[]); C=nthroot( abs( C(1,1:1001) ), 1); hFig=figure(); hax=axes(hFig); imagesc(time,potential,C);
    
    filename=fullfile('/home/masi/Images/test'); 
    filenameMat=fullfile('/home/masi/Images/test.mat');
    export_fig(filename, '-tif', '-q101', '-a1', '-m1', '-RGB', '-nofontswap', '-nocrop', '-transparent', '-dpng', hax);
    save(filenameMat,'time', 'potential', 'C', '-v7.3'); 
    
  • #1-2 都成功导入许多变量的 Mathematica

    (* http://mathgis.blogspot.fi/2010/09/tips-import-matlab-mat-files.html *)
    (* https://mathematica.stackexchange.com/a/10589/9815 *)
    
    (* #1 Succeeds; select specific data sets *)
    mma = Import["~/Images/test.mat", {"HDF5", "Datasets", "/time"}];
    
    (* #2 Succeeds: Out {"/C", "/potential", "/time"} *)
    mma = Import["~/Images/test.mat", {"HDF5", "Datasets"}];
    
    (* Output: {{1.}, {1.5}, {2.}} *)
    
  • 输出:步骤 (1-4) 成功,但在 Mathematica 11 中导入数据文件(步骤 5)失败,请参阅上面的错误消息。

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

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

(* Output fails: {} *)

学习agentp的answer

他只是使用一个方阵。 我有三个变量中的数据:timepotentialC,适合imagesc() 的参数。

  1. 做向量 time mx 1 和 potential nx 1 的方阵。如何在方阵中应用向量 C 一个?我对这里的数学了解不够,无法自己回答这个问题。

    # 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
操作系统:Debian 8.5
相关:Is there a way to import the results or data from Matlab to Mathematica automatically?

【问题讨论】:

  • 方法 2 显然需要知道尺寸以便您可以分区(或 ArrayReshape 适当地,(当然解决问题的一种方法是将尺寸写入文件)
  • 不确定从matlab获取数据到mathematica的一般方法,但是当您传输图像时,您是否考虑将它们存储为图像?
  • “MAT-File 7.3,基于 HDF5,但具有未记录的特殊约定。”似乎您不应该指望它的可移植性。我个人会使用原始二进制字节流
  • @agentp 你能使用遵循文档约定的二进制 HDF5 吗?不知道有没有这样的东西。
  • “导入”到 Mathematica(或 MATLAB)通常是指将数据加载到内存中。由于您要处理数 TB 的数据,因此您是否拥有所需的 TB 级 RAM?

标签: matlab binary wolfram-mathematica type-conversion


【解决方案1】:

从 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)

【讨论】:

  • 请看正文。我现在可以制作方阵,但无法在方阵中应用矢量Cimagesc() 需要)。我不明白imagesc()C 背后的数学原理。如何进行?
  • 您可以一个接一个地编写多个矩阵,只需为每个矩阵重复 2 次 fwrite 调用。您问题的另一部分似乎与保存数据无关,可能会将其作为新问题发布。
  • 是的,你可能是对的。我只是在想你可以有效地存储imagesc() 的数据。如果可以使用单个矩阵来完成,我不想过多地传播数据,因为我认为它应该是可能的。
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 2018-02-13
  • 2023-03-25
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多