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. Show
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ữ 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 7 và 8 như sau:
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):
Để giữ cho thứ tự đảo ngược cấu trúc dict/danh sách: 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:
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à 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 đặtCá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ảnLoạ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() Đầ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()0 và from ypstruct import *p = struct()1 được đặt. Sau đó, giá trị của một trường mới from ypstruct import *p = struct()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()3Class. Đó là: p = struct(x=3, y=4) 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()7; Bởi vì cấu trúc là một lớp con của 7, loại từ điển tích hợp. Vì vậy, from ypstruct import *p = struct()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 ( 7). Ví dụ: bạn có thể chuyển đổi đối tượng 7 thành pip install ypstruct 3 như sau:my_dict = {'x':3, 'y':4} 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) Đầ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ápLớ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 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})9Sử 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: 0Hai đố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: 1Mã này sẽ xuất ra: 2Lưu ý rằng các giá trị từ toán hạng thứ hai (đó là p = struct(x=3, y=4) 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()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: 3Sau đó, chúng ta có thể khởi tạo mảng dân số bằng mã sau: 4Mã này sử dụng phương thức p = struct(x=3, y=4) 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) 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: 5Nhậ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)4Phương pháp my_dict = {'x':3, 'y':4} 4 trả về một 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: 6Đầu ra sẽ là: 7Có 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)8Một trường mới có thể được thêm vào bằng phương pháp my_dict = {'x':3, 'y':4} 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) 0. Một mã mẫu theo sau: 8Mã này sẽ in ra văn bản này dưới dạng đầu ra: 9Thay vì sử dụng phương thức my_dict = {'x':3, 'y':4} 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) 3 (gán). Ví dụ: mã đã đề cập ở trên có thể được đơn giản hóa như thế này: 0Kế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)4Mộ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) 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: 1Đầu ra sẽ là thế này: 2Tạ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)8pip 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: 3Bâ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: 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) 7 và p = struct(x=3, y=4) 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) 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: 5Lầ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ậnSử 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.
Hy vọng bạn thích bài đăng này trên YPStruct và các cấu trúc trong Python. |