【问题标题】:Create and save as matlab-double in python在python中创建并保存为matlab-double
【发布时间】:2016-11-03 13:23:04
【问题描述】:

我有一个 matlab 脚本,它要求数据在 matlab 中排列为双精度(一个时间向量和一个多列)。但是,我的原始数据有两个多列,所以我一直在尝试创建多个 matlab 文件,只有一次在 python 中的一个数组(我更熟悉 python)

我几乎成功了,但是当我将其导入 matlab 时,数据以 1x1 结构存储。所以我想要一种在 python 中保存 matlab 文件的方法,所以我可以将它作为 nX2 double 导入到 matlab 中。

这是我的代码:
import numpy as np
import scipy.io as sc

# Import matlab data
Seat = sc.loadmat('WC_Seat_Session1')
Back = sc.loadmat('WC_Back_Session1')

# Remove data from dict
Seat.pop("__globals__")
Seat.pop("__header__")
Seat.pop("__version__")
Seat.pop("ShimmerA_Timestamp_Shimmer_CAL")
Back.pop("__globals__")
Back.pop("__header__")
Back.pop("__version__")
Back.pop("id5F17_Timestamp_Shimmer_CAL")

# Create new Timestamp nessesary for next script
SF = 256
L = len(Seat['s1'])
T = L/SF
time_vec = np.arange(1/SF,T+1/SF,1/SF)


Seat_X = {'AAA': time_vec, 'SeatX':Seat['s1']}
Seat_Y = {'AAA': time_vec, 'SeatY':Seat['s2']}
Seat_Z = {'AAA': time_vec, 'SeatZ':Seat['s3']}

Back_X = {'AAA': time_vec, 'BackX':Back['b1']}
Back_Y = {'AAA': time_vec, 'BackY':Back['b2']}
Back_Z = {'AAA': time_vec, 'BackZ':Back['b3']}

# Save data as a matlab file
sc.savemat('Seat_X.mat', {'Seat_X': Seat_X }, oned_as='column')
sc.savemat('Seat_Y.mat', {'Seat_Y': Seat_Y}, oned_as='column')
sc.savemat('Seat_Z.mat', {'Seat_Z': Seat_Z}, oned_as='column')
sc.savemat('Back_X.mat', {'Back_X': Seat_X}, oned_as='column')
sc.savemat('Back_Y.mat', {'Back_Y': Seat_Y}, oned_as='column')
sc.savemat('Back_Z.mat', {'Back_Z': Seat_Z}, oned_as='column')

(我知道,这可能会以更有效的方式完成,但我没有编程经验)

希望有人能提供帮助。

【问题讨论】:

    标签: python matlab


    【解决方案1】:

    {'AAA': time_vec, 'SeatX':Seat['s1']} 之类的代码会创建一个 python dict。 Scipy.savemat 将 dict 存储为 MATLAB struct(这是 MATLAB 直到最近才拥有的最接近 dict 的东西)。这个struct 应该有两个字段,AAASeatX,每个字段都包含一个列向量。在 MATLAB 中,使用 var = [Seat_X.AAA, Seat_X.SeatX]; 之类的代码很容易将两者结合起来。

    话虽如此,使用 numpy 在 Python 中创建所需的数据结构非常容易:

    import numpy as np 
    
    Seat_x = np.vstack([time_vec, Back['b1'].ravel()]).T
    sc.savemat('Seat_X.mat', {'Seat_X': Seat_X})
    

    其他的以此类推。

    ravel 变平 Back['b1']。如果您绝对确定 Back['b1'] 是一维或二维“行向量”,那么您可以不使用它。

    这段代码所做的是将一维time_vec 和扁平化为一维的Back['b1'] 垂直堆叠为新数组中的两行。然后.T 方法将两行转换为两列。其他一切都一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多