Hướng dẫn matlab struct to python - cấu trúc matlab thành python

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.

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.

Nó không xuất hiện như thể bạn có thể lưu trữ

struct = [
    {'val': A, 'sl': B},
    {'val': 137, 'sl': 138},
]

struct[0]['val']  # A
struct[1]['sl'] # 138
6 dưới dạng một yếu tố của bản ghi, vì các trường cần có cùng kích thước. Có vẻ như việc thêm một mảng 3x3 vào trường Val làm cho kích thước của trường 2x3x3 đó, thay vì được lưu trữ dưới dạng một mảng rời rạc.

Tuy nhiên, bạn có thể mô phỏng cùng một loại cấu trúc bằng cách sử dụng các loại Python

struct = [
    {'val': A, 'sl': B},
    {'val': 137, 'sl': 138},
]

struct[0]['val']  # A
struct[1]['sl'] # 138
7 và
struct = [
    {'val': A, 'sl': B},
    {'val': 137, 'sl': 138},
]

struct[0]['val']  # A
struct[1]['sl'] # 138
8 như sau:

struct = {
   'val': [A, B],
   'sl': [137, 138]
}

Bây giờ bạn có thể truy cập các yếu tố này như sau (lưu ý thứ tự đối số là khác nhau):

struct['val'][0] # = A
struct['sl'][1] # 138

Để giữ cho thứ tự đảo ngược cấu trúc dict/danh sách:

struct = [
    {'val': A, 'sl': B},
    {'val': 137, 'sl': 138},
]

struct[0]['val']  # A
struct[1]['sl'] # 138

Cấu trúc trong Matlab/Octave và Python

Các cấu trúc có sẵn trong các ngôn ngữ khác nhau, như C, C ++, C# và MATLAB và chúng chủ yếu được sử dụng để tổ chức dữ liệu dưới dạng các loại tổng hợp, chứa một tập hợp các trường xác định. Trong cấu trúc C, C ++ và C#, được xác định là các loại dữ liệu mới và sau đó các biến mới của loại đó được khai báo. Trong C ++ và C#, các cấu trúc là các lớp và chúng cũng có thể bao gồm các phương thức và thành viên riêng. Ngược lại, cấu trúc MATLAB là một loại dữ liệu chung để tổ chức và nhóm một số trường thuộc nhiều loại khác nhau, thậm chí thuộc loại cấu trúc.

Trong Python, có một số cách để có chức năng như cấu trúc:

  1. Sử dụng
    struct = [
        {'val': A, 'sl': B},
        {'val': 137, 'sl': 138},
    ]
    
    struct[0]['val']  # A
    struct[1]['sl'] # 138
    
    7 (xem tại đây), loại từ điển tích hợp trong Python, thực sự là một mảng các mục giá trị quan trọng;
  2. sử dụng một lớp trống hoặc một lớp tạm thời, sau đó thêm các trường bắt buộc vào nó;
  3. sử dụng một lớp được mã hóa cứng, với tất cả các trường và phương thức cần thiết;
  4. và sử dụng lớp
    pip install ypstruct
    0 (xem tại đây), đây là một bộ điều khiển với các phím cho mỗi mục và đó là một loại bất biến.

Không có giải pháp nào trong số này giống hệt như cấu trúc MATLAB. Để làm điều này, tôi đã phát triển một lớp con là

struct = [
    {'val': A, 'sl': B},
    {'val': 137, 'sl': 138},
]

struct[0]['val']  # A
struct[1]['sl'] # 138
7, sử dụng toán tử
pip install ypstruct
2 (DOT) để truy cập các trường, giống như các cấu trúc MATLAB và C/C ++/C#. Ngoài ra, nó có khả năng nhận được danh sách các trường, thêm và loại bỏ các trường, hợp nhất hai hoặc nhiều cấu trúc, lặp lại và sao chép, và tạo các bản sao nông và sâu, là phương tiện của các phương thức được xác định.

Dự án này được đặt tên là YPStruct, viết tắt của Cấu trúc Yarpiz và mã nguồn của nó có sẵn trên GitHub (ở đây) và nó được xuất bản trên PYPI, Chỉ số gói Python (ở đây). Trong bài viết này, chúng ta sẽ thấy cách cài đặt và sử dụng YPStructs, để có kinh nghiệm tương tự như các cấu trúc MATLAB trong Python.ypstruct, which stands for Yarpiz Structure, and its source code is available on GitHub (here) and it is published on PyPI, the Python Package Index (here), as well. In this article, we will see how ypstruct can be installed and used, to have an experience similar to MATLAB structures in Python.

Cài đặt

Cách đơn giản nhất để cài đặt YPStruct trên máy của bạn là sử dụng PIP. Đơn giản chỉ cần chạy cái này trong thiết bị đầu cuối:

pip install ypstruct

Để cài đặt gói YPStruct trên máy tính của bạn.

Ngoài ra, bạn có thể nhận mã nguồn từ kho lưu trữ GitHub (tại đây) và bao gồm trong dự án của bạn hoặc thiết lập trên máy của bạn.

Cách sử dụng cơ bản

Loại cấu trúc trong gói YPStruct được xác định bởi lớp

pip install ypstruct
3. Lớp này cũng có một tên bí danh,
pip install ypstruct
4. Bạn có thể bao gồm
pip install ypstruct
3 hoặc
pip install ypstruct
6 từ gói này hoặc đơn giản là bao gồm mọi thứ có sẵn bằng biểu tượng
pip install ypstruct
7.

Cách sử dụng đơn giản của

pip install ypstruct
3 được đưa ra trong khối mã sau.

from ypstruct import *p = struct()
p.x = 3
p.y = 5
p.A = p.x * p.y
print(p)

Đầu ra của mã này sẽ như sau:

struct({'x': 3, 'y': 4, 'A': 12})

Trong khối mã ở trên, sau khi nhập các lớp YPStruct, một thể hiện

pip install ypstruct
3 được tạo và khởi tạo mà không có bất kỳ trường và dữ liệu nào trong đó. Sau đó, các trường
from ypstruct import *p = struct()
p.x = 3
p.y = 5
p.A = p.x * p.y
print(p)
0 và
from ypstruct import *p = struct()
p.x = 3
p.y = 5
p.A = p.x * p.y
print(p)
1 được đặt. Sau đó, giá trị của một trường mới
from ypstruct import *p = struct()
p.x = 3
p.y = 5
p.A = p.x * p.y
print(p)
2, được xác định bằng cách sử dụng các giá trị của hai trường khác. Cuối cùng, biểu diễn chuỗi của đối tượng cấu trúc được in ra.

Trong mã này, có thể khởi tạo các trường và giá trị của chúng bằng cách sử dụng hàm tạo

from ypstruct import *p = struct()
p.x = 3
p.y = 5
p.A = p.x * p.y
print(p)
3Class. Đó là:

p = struct(x=3, y=4)
p.A = p.x * p.y

Làm thế nào pip install ypstruct3 và struct = [ {'val': A, 'sl': B}, {'val': 137, 'sl': 138}, ] struct[0]['val'] # A struct[1]['sl'] # 138 7 có liên quan?

Bạn có thể truy cập các trường của đối tượng cấu trúc bằng toán tử

pip install ypstruct
2 (DOT), cũng như toán tử lập chỉ mục
from ypstruct import *p = struct()
p.x = 3
p.y = 5
p.A = p.x * p.y
print(p)
7; Bởi vì cấu trúc là một lớp con của
struct = [
    {'val': A, 'sl': B},
    {'val': 137, 'sl': 138},
]

struct[0]['val']  # A
struct[1]['sl'] # 138
7, loại từ điển tích hợp. Vì vậy,
from ypstruct import *p = struct()
p.x = 3
p.y = 5
p.A = p.x * p.y
print(p)
9 và
struct({'x': 3, 'y': 4, 'A': 12})
0 tương đương và chúng có thể được sử dụng thay thế cho nhau.

Ngoài ra, một đối tượng cấu trúc (

pip install ypstruct
3) có thể được chuyển đổi và tạo từ đối tượng từ điển (
struct = [
    {'val': A, 'sl': B},
    {'val': 137, 'sl': 138},
]

struct[0]['val']  # A
struct[1]['sl'] # 138
7). Ví dụ: bạn có thể chuyển đổi đối tượng
struct = [
    {'val': A, 'sl': B},
    {'val': 137, 'sl': 138},
]

struct[0]['val']  # A
struct[1]['sl'] # 138
7 thành
pip install ypstruct
3 như sau:

my_dict = {'x':3, 'y':4}
p = struct(my_dict)

Ngoài ra, đối tượng cấu trúc cũng có thể được chuyển đổi thành từ điển:

p = struct(x=3, y=4)
p.z = 12
my_dict = dict(p)
print(my_dict)

Đầu ra của mã này được hiển thị dưới đây.

{'x': 3, 'y': 4, 'z': 12}

Người vận hành và phương pháp

Lớp

pip install ypstruct
3 (cũng là bí danh
pip install ypstruct
4) thực hiện một số toán tử và phương thức, có thể được sử dụng để thay đổi dữ liệu trong cấu trúc và các trường của nó hoặc thực hiện các hoạt động khác. Lưu ý rằng, bất kỳ phương thức hoặc toán tử nào được xác định cho lớp
struct = [
    {'val': A, 'sl': B},
    {'val': 137, 'sl': 138},
]

struct[0]['val']  # A
struct[1]['sl'] # 138
7 cũng có sẵn cho các lớp này.

Các toán tử và phương pháp được xác định cho lớp

pip install ypstruct
3 được thảo luận trong các phần sau của bài đăng này.

Hợp nhất các cấu trúc bằng toán tử struct({'x': 3, 'y': 4, 'A': 12})9

Sử dụng toán tử

struct({'x': 3, 'y': 4, 'A': 12})
9, có thể hợp nhất dữ liệu từ hai trường hợp của lớp
pip install ypstruct
3 để tạo một đối tượng cấu trúc kết hợp. Ví dụ: chúng ta hãy xác định hai cấu trúc như sau:

struct['val'][0] # = A
struct['sl'][1] # 138
0

Hai đối tượng

pip install ypstruct
3 này có thể được hợp nhất bằng toán tử
struct({'x': 3, 'y': 4, 'A': 12})
9:

struct['val'][0] # = A
struct['sl'][1] # 138
1

Mã này sẽ xuất ra:

struct['val'][0] # = A
struct['sl'][1] # 138
2

Lưu ý rằng các giá trị từ toán hạng thứ hai (đó là

p = struct(x=3, y=4)
p.A = p.x * p.y
4) được sử dụng cho trường chung của hai cấu trúc. Vì vậy, chúng ta thấy giá trị 5 cho trường
from ypstruct import *p = struct()
p.x = 3
p.y = 5
p.A = p.x * p.y
print(p)
1 trong đối tượng cấu trúc hợp nhất. Kết quả của hoạt động hợp nhất là một cấu trúc chứa tất cả các trường được xác định trong các toán hạng.

Lặp lại các cấu trúc sử dụng toán tử pip install ypstruct7 và phương pháp p = struct(x=3, y=4)p.A = p.x * p.y7

Đôi khi chúng ta cần lặp lại/sao chép một cấu trúc. Ví dụ, giả sử rằng chúng tôi sẽ thực hiện một thuật toán tiến hóa và chúng tôi đã định nghĩa các cá nhân là đối tượng

pip install ypstruct
3. Đầu tiên chúng ta cần tạo một mẫu:

struct['val'][0] # = A
struct['sl'][1] # 138
3

Sau đó, chúng ta có thể khởi tạo mảng dân số bằng mã sau:

struct['val'][0] # = A
struct['sl'][1] # 138
4

Mã này sử dụng phương thức

p = struct(x=3, y=4)
p.A = p.x * p.y
7 để khởi tạo danh sách các đối tượng
pip install ypstruct
3 riêng biệt có cùng các trường dữ liệu.

Thay vì sử dụng phương pháp

p = struct(x=3, y=4)
p.A = p.x * p.y
7, có thể sử dụng toán tử
pip install ypstruct
7 để thực hiện sao chép các cấu trúc. Ví dụ: dòng thứ hai của khối mã trước có thể được viết lại bằng toán tử
pip install ypstruct
7 như sau:

struct['val'][0] # = A
struct['sl'][1] # 138
5

Nhận danh sách các trường được xác định bằng phương pháp my_dict = {'x':3, 'y':4}p = struct(my_dict)4

Phương pháp

my_dict = {'x':3, 'y':4}
p = struct(my_dict)
4 trả về một
struct = [
    {'val': A, 'sl': B},
    {'val': 137, 'sl': 138},
]

struct[0]['val']  # A
struct[1]['sl'] # 138
8 của các trường được xác định trong cấu trúc. Một ví dụ sử dụng theo sau:

struct['val'][0] # = A
struct['sl'][1] # 138
6

Đầu ra sẽ là:

struct['val'][0] # = A
struct['sl'][1] # 138
7

Có một danh sách các trường có thể hữu ích khi chúng ta sẽ thực hiện các hoạt động trên các trường cấu trúc. Ví dụ, trong các vấn đề tối ưu hóa thực tế, chúng tôi xử lý các biến quyết định khác nhau của các loại khác nhau. Người ta có thể gói gọn các biến quyết định bên trong đối tượng

pip install ypstruct
3. Thực hiện các hoạt động, như sửa đổi, phân tích cú pháp, xử lý trước hoặc xử lý hậu kỳ của các biến quyết định này, có thể dễ dàng hơn nhiều bằng cách lặp lại danh sách các biến quyết định, ví dụ: Các trường được xác định của đối tượng cấu trúc.

Thêm các trường mới bằng phương pháp my_dict = {'x':3, 'y':4}p = struct(my_dict)8

Một trường mới có thể được thêm vào bằng phương pháp

my_dict = {'x':3, 'y':4}
p = struct(my_dict)
8. Phương thức này chấp nhận hai đối số đầu vào: Tên trường và giá trị của nó. Giá trị là tùy chọn và nếu nó bị bỏ qua, thì giá trị được giả sử là
p = struct(x=3, y=4)
p.z = 12
my_dict = dict(p)
print(my_dict)
0. Một mã mẫu theo sau:

struct['val'][0] # = A
struct['sl'][1] # 138
8

Mã này sẽ in ra văn bản này dưới dạng đầu ra:

struct['val'][0] # = A
struct['sl'][1] # 138
9

Thay vì sử dụng phương thức

my_dict = {'x':3, 'y':4}
p = struct(my_dict)
8, có thể chỉ cần sử dụng các toán tử
pip install ypstruct
2 (DOT) và
p = struct(x=3, y=4)
p.z = 12
my_dict = dict(p)
print(my_dict)
3 (gán). Ví dụ: mã đã đề cập ở trên có thể được đơn giản hóa như thế này:

struct = [
    {'val': A, 'sl': B},
    {'val': 137, 'sl': 138},
]

struct[0]['val']  # A
struct[1]['sl'] # 138
0

Kết quả của hai khối mã này sẽ giống nhau.

Loại bỏ các trường bằng phương pháp p = struct(x=3, y=4)p.z = 12my_dict = dict(p)print(my_dict)4

Một trường có thể được xóa khỏi đối tượng

pip install ypstruct
3 bằng phương pháp
p = struct(x=3, y=4)
p.z = 12
my_dict = dict(p)
print(my_dict)
4. Phương thức này có một tên trường và xóa (xóa) trường được chỉ định khỏi đối tượng cấu trúc. Một ví dụ được đưa ra dưới đây:

struct = [
    {'val': A, 'sl': B},
    {'val': 137, 'sl': 138},
]

struct[0]['val']  # A
struct[1]['sl'] # 138
1

Đầu ra sẽ là thế này:

struct = [
    {'val': A, 'sl': B},
    {'val': 137, 'sl': 138},
]

struct[0]['val']  # A
struct[1]['sl'] # 138
2

Tạo các bản sao bằng phương pháp p = struct(x=3, y=4)p.z = 12my_dict = dict(p)print(my_dict)7 và p = struct(x=3, y=4)p.z = 12my_dict = dict(p)print(my_dict)8

pip install ypstruct
3 là một loại tham chiếu. Để có một bản sao của một đối tượng
pip install ypstruct
3, bạn không thể chỉ cần sử dụng toán tử gán. Ví dụ: chúng ta hãy tạo một đối tượng cấu trúc:

struct = [
    {'val': A, 'sl': B},
    {'val': 137, 'sl': 138},
]

struct[0]['val']  # A
struct[1]['sl'] # 138
3

Bây giờ chúng tôi gán giá trị này cho một biến mới và sau đó cố gắng thay đổi giá trị của một trường:

struct = [
    {'val': A, 'sl': B},
    {'val': 137, 'sl': 138},
]

struct[0]['val']  # A
struct[1]['sl'] # 138
4

Điều này cũng sẽ thay đổi đối tượng cấu trúc p. Bởi vì

{'x': 3, 'y': 4, 'z': 12}
1 và
{'x': 3, 'y': 4, 'z': 12}
2 đang tham khảo cùng một đối tượng.

Để tạo các bản sao của các đối tượng cấu trúc, hai phương thức được triển khai trong lớp

pip install ypstruct
3:
p = struct(x=3, y=4)
p.z = 12
my_dict = dict(p)
print(my_dict)
7 và
p = struct(x=3, y=4)
p.z = 12
my_dict = dict(p)
print(my_dict)
8. Cái đầu tiên cho chúng ta một bản sao nông của đối tượng
pip install ypstruct
3. Nhưng sử dụng
p = struct(x=3, y=4)
p.z = 12
my_dict = dict(p)
print(my_dict)
8, như tên của phương thức nói, chúng ta có thể tạo các bản sao sâu của các đối tượng cấu trúc.

Cách chính xác để tạo một bản sao của P như sau:

struct = [
    {'val': A, 'sl': B},
    {'val': 137, 'sl': 138},
]

struct[0]['val']  # A
struct[1]['sl'] # 138
5

Lần này,

{'x': 3, 'y': 4, 'z': 12}
2 đang tham khảo một đối tượng
pip install ypstruct
3 khác (sự kiện có cùng giá trị) và sửa đổi nó sẽ không ảnh hưởng đến
{'x': 3, 'y': 4, 'z': 12}
1.

Sự kết luận

Sử dụng

pip install ypstruct
3 từ YPStruct có thể rất hữu ích trong việc triển khai các dự án và ứng dụng bằng Python. Nó tiết kiệm rất nhiều thời gian trong các dự án đang xử lý các loại dữ liệu giống như lớp với các trường và không có phương thức. Ngoài ra, nó sẽ hữu ích cho người dùng MATLAB, những người đang cố gắng thực hiện lại các chương trình của họ bằng Python, đang sử dụng các cấu trúc.ypstruct can be very helpful in implementing projects and applications using Python. It saves a lot time in projects which are dealing with class-like data types with fields and without methods. Also it will be useful for MATLAB users who are trying to reimplement their programs in Python, which are using structures.

Trước đây, tôi đã sử dụng YPSTRUST để thực hiện các thuật toán và dự án khác nhau. Một số ví dụ được liệt kê dưới đây.

  • Khí thần kinh (NG) và phát triển khí thần kinh (GNG) trong Python, một thuật toán học tập không giám sát, lấy cảm hứng từ bản đồ tự tổ chức (SOM), chủ yếu được sử dụng để thực hiện phân cụm. Kho lưu trữ GitHub có sẵn ở đây. and Growing Neural Gas (GNG) in Python, an unsupervised learning algorithm, inspired by Self-organizing Map (SOM), which is mainly used to perform clustering. GitHub repository is available here.
  • Sự tiến hóa khác biệt (DE) trong Python, một thuật toán tiến hóa, là một thuật toán tối ưu hóa đa năng. Kho lưu trữ GitHub có sẵn ở đây. in Python, an evolutionary algorithm, which is a general-purpose optimization algorithm. GitHub repository is available here.
  • Thuật toán di truyền (GA) trong Python, một thuật toán tiến hóa nổi tiếng lấy cảm hứng từ sự tiến hóa tự nhiên, đó là một phương pháp tối ưu hóa đa năng.Tôi đã triển khai mã này trong một khóa học video về các thuật toán di truyền, có sẵn miễn phí trên YouTube, thông qua liên kết này và các phần liên quan của nó. in Python, a well-known evolutionary algorithm inspired by natural evolution, which is a general-purpose optimization approach. I implemented this code in a video course on Genetic Algorithms, which is freely available on YouTube, via this link and its related parts.

Hy vọng bạn thích bài đăng này trên YPStruct và các cấu trúc trong Python.