Hướng dẫn convert matlab struct to python - chuyển đổi cấu trúc matlab thành python

Bạn có chia sẻ thêm chi tiết về cách tạo tệp "lib.mat" không? Tôi đã thử các bước sau:

>>lib.name='hello''hello'

>>Strs(1).id=1

>>Strs(2).id=2

>>Strs(3).id=3

>> lib.strs = strs

>> lib.strlist = {1,2,3}

>> lưu ('lib', 'lib'))'lib', 'lib')

Đây là những gì tôi thấy trong Python:

>>> obj = eng.load ('lib.mat') ['lib']]'lib.mat')['lib']

...

ValueError: Chỉ có thể trả lại một cấu trúc vô hướng từ MATLABscalar struct can be returned from MATLAB

Đây là hành vi dự kiến ​​vì mảng struct không được hỗ trợ theo tài liệu:

https://www.mathworks.com/help/matlab/matlab_external/handle-data-returned-from-matlab-to-python.html

Trong trường hợp này, bản thân "lib" là một cấu trúc vô hướng nhưng phần tử "STRS" là một mảng cấu trúc.

Tôi đang sử dụng MATLAB (2014b) và Python (2.7.6) để lập trình hỗn hợp. Tôi đã cố gắng chuyển một cấu trúc từ Matlab sang Python, nhưng tôi đã thất bại.

Cấu trúc tôi muốn vượt qua là:

dmodel = struct ('regr', regr, 'corr', corr, 'theta', theta. ', ...'regr',regr, 'corr',corr, 'theta',theta.', ...

'beta', fit.beta, 'gamma', fit.gamma, 'sigma2', sy.^2.*fit.sigma2, ...,fit.beta, 'gamma',fit.gamma, 'sigma2',sY.^2.*fit.sigma2, ...

'S', s, 'ssc', [ms; ss], 'ysc', [của tôi; Sy], ...,S, 'Ssc',[mS; sS], 'Ysc',[mY; sY], ...

'C', fit.c, 'ft', fit.ft, 'g', fit.g);,fit.C, 'Ft',fit.Ft, 'G',fit.G);

Trong cấu trúc, tất cả các yếu tố là vô hướng ngoại trừ SSC và YSC.

Kịch bản MATLAB trông như thế này:

function model = fun_mat ()model=Fun_mat()

...

một số lệnh;command;

...

một số lệnh;

mô hình = dmodel;

chấm dứt

Và kịch bản Python trông như thế này:matlab.engine as meng

nhập matlab.engine với tư cách là meng

Eng = meng.start_matlab ()

eng.quit()

dmodel = eng.fun_mat ()

Hai kịch bản này nằm trong cùng một thư mục.

Tôi có một tệp mat mà tôi truy cập bằng cách sử dụng

from scipy import io
mat = io.loadmat('example.mat')

Từ MATLAB, ví dụ.mat chứa cấu trúc sau

    >> load example.mat
    >> data1

    data1 =

            LAT: [53x1 double]
            LON: [53x1 double]
            TIME: [53x1 double]
            units: {3x1 cell}


    >> data2

    data2 = 

            LAT: [100x1 double]
            LON: [100x1 double]
            TIME: [100x1 double]
            units: {3x1 cell}

Trong MATLAB, tôi có thể truy cập dữ liệu dễ dàng như Data2.lon, v.v. Nó cho tôi một số tùy chọn mặc dù như

mat.clear       mat.get         mat.iteritems   mat.keys        mat.setdefault  mat.viewitems   
mat.copy        mat.has_key     mat.iterkeys    mat.pop         mat.update      mat.viewkeys    
mat.fromkeys    mat.items       mat.itervalues  mat.popitem     mat.values      mat.viewvalues    

Có thể bảo tồn cấu trúc tương tự trong Python không? Nếu không, làm thế nào để truy cập tốt nhất dữ liệu? Mã python hiện tại mà tôi đang sử dụng rất khó để làm việc.

Cảm ơn

Hỏi ngày 14 tháng 8 năm 2012 lúc 14:51Aug 14, 2012 at 14:51

MikepmikepmikeP

7812 Huy hiệu vàng10 Huy hiệu bạc19 Huy hiệu đồng2 gold badges10 silver badges19 bronze badges

5

Đã trả lời ngày 14 tháng 8 năm 2012 lúc 15:22Aug 14, 2012 at 15:22

MikepmikepmikeP

7812 Huy hiệu vàng10 Huy hiệu bạc19 Huy hiệu đồng2 gold badges10 silver badges19 bronze badges

1

Đã trả lời ngày 14 tháng 8 năm 2012 lúc 15:22

# Load the data into Python     
D= sio.loadmat('data.mat')

# build a list of keys and values for each entry in the structure
vals = D['results'][0,0] #<-- set the array you want to access. 
keys = D['results'][0,0].dtype.descr

# Assemble the keys and values into variables with the same name as that used in MATLAB
for i in range(len(keys)):
    key = keys[i][0]
    val = np.squeeze(vals[key][0][0])  # squeeze is used to covert matlat (1,n) arrays into numpy (1,) arrays. 
    exec(key + '=val')

Khi tôi cần tải dữ liệu vào Python từ MATLAB được lưu trữ trong một mảng các cấu trúc {strut_1, struct_2} Tôi trích xuất một danh sách các khóa và giá trị từ đối tượng mà tôi tải bằng scipy.io.loadmat. Sau đó, tôi có thể lắp ráp chúng vào các biến của riêng mình, hoặc nếu cần, đóng gói lại chúng thành một từ điển. Việc sử dụng lệnh exec có thể không phù hợp trong mọi trường hợp, nhưng nếu bạn chỉ cố gắng xử lý dữ liệu thì nó hoạt động tốt.Mar 4, 2018 at 17:47

Hướng dẫn convert matlab struct to python - chuyển đổi cấu trúc matlab thành python

Đã trả lời ngày 4 tháng 3 năm 2018 lúc 17:47Austin Downey

Austin Downeyaustin Downey2 gold badges10 silver badges25 bronze badges

8832 Huy hiệu vàng10 Huy hiệu bạc25 Huy hiệu đồng

def _check_keys( dict):
"""
checks if entries in dictionary are mat-objects. If yes
todict is called to change them to nested dictionaries
"""
for key in dict:
    if isinstance(dict[key], sio.matlab.mio5_params.mat_struct):
        dict[key] = _todict(dict[key])
return dict


def _todict(matobj):
    """
    A recursive function which constructs from matobjects nested dictionaries
    """
    dict = {}
    for strg in matobj._fieldnames:
        elem = matobj.__dict__[strg]
        if isinstance(elem, sio.matlab.mio5_params.mat_struct):
            dict[strg] = _todict(elem)
        else:
            dict[strg] = elem
    return dict


def loadmat(filename):
    """
    this function should be called instead of direct scipy.io .loadmat
    as it cures the problem of not properly recovering python dictionaries
    from mat files. It calls the function check keys to cure all entries
    which are still mat-objects
    """
    data = sio.loadmat(filename, struct_as_record=False, squeeze_me=True)
    return _check_keys(data)

Điều này sẽ trả lại cấu trúc thảm làm từ điểnDec 8, 2020 at 8:36

Hướng dẫn convert matlab struct to python - chuyển đổi cấu trúc matlab thành python

idan357idan357idan357

Đã trả lời ngày 8 tháng 12 năm 2020 lúc 8:364 silver badges14 bronze badges

3224 Huy hiệu bạc14 Huy hiệu Đồng

>> thisStruct

ans =
      var1: [1x1 struct]
      var2: 3.5

>> thisStruct.var1

ans =
      subvar1: [1x100 double]
      subvar2: [32x233 double]

Sau đó, sử dụng mã của Mergen trong SCIPY.IO.LoadMat Cấu trúc lồng nhau (tức là từ điển)

Đã trả lời ngày 29 tháng 4 năm 2015 lúc 20:24Apr 29, 2015 at 20:24

BRAULIOBAULIObraulio

4202 Huy hiệu bạc9 Huy hiệu đồng2 silver badges9 bronze badges

Tương đương của một cấu trúc matlab trong Python là gì?

Python không chính xác có điều tương tự như một cấu trúc trong Matlab. Bạn có thể đạt được một cái gì đó giống như nó bằng cách xác định một lớp trống và sau đó xác định các thuộc tính của lớp. Bạn có thể kiểm tra xem một đối tượng có thuộc tính cụ thể sử dụng HasAttr không.. You can achieve something like it by defining an empty class and then defining attributes of the class. You can check if an object has a particular attribute using hasattr.

Tôi có thể sử dụng mã MATLAB trong Python không?

MATLAB® cung cấp tích hợp hai chiều linh hoạt với nhiều ngôn ngữ lập trình, bao gồm cả Python.Điều này cho phép các nhóm khác nhau làm việc cùng nhau và sử dụng các thuật toán MATLAB trong các hệ thống phần mềm sản xuất và CNTT.® provides a flexible, two-way integration with many programming languages, including Python. This allows different teams to work together and use MATLAB algorithms within production software and IT systems.

Làm thế nào để bạn chuyển đổi một cấu trúc thành một mảng trong matlab?

C = struct2cell (s) chuyển đổi một cấu trúc thành một mảng tế bào.Mảng ô c chứa các giá trị được sao chép từ các trường của s.Hàm struct2Cell không trả về tên trường.Để trả về tên trường trong một mảng ô, hãy sử dụng hàm FieldNames. converts a structure into a cell array. The cell array C contains values copied from the fields of S . The struct2cell function does not return field names. To return the field names in a cell array, use the fieldnames function.

Làm cách nào để sử dụng thư viện MATLAB trong Python?

Để khởi động MATLAB Engine trong phiên Python, hãy cài đặt API động cơ dưới dạng gói Python ...
Tập lệnh thiết lập Python để cài đặt API MATLAB Engine ..
Cài đặt API MATLAB Engine cho Python ở các vị trí Nondefault ..