Ma trận và vector
Kiểu vector
là một kiểu dữ liệu đặc biệt trong MQL5, cho phép thực hiện các phép toán với vector. Vector là một mảng một chiều có kiểu double. Đây là một trong những khái niệm cơ bản của đại số tuyến tính, được sử dụng trong nhiều lĩnh vực khoa học, bao gồm vật lý, hình học và các lĩnh vực khác. Vector được dùng để giải hệ phương trình tuyến tính, trong đồ họa 3D và các lĩnh vực ứng dụng khác. Vector có thể được cộng và nhân. Độ dài hoặc khoảng cách giữa các vector có thể được tính thông qua Norm. Trong lập trình, vector thường được biểu diễn bằng mảng các phần tử đồng nhất, nhưng có thể không có các phép toán vector thông thường, tức là khi các mảng không thể cộng hoặc nhân, và chúng không có norm.
Vector có thể được biểu diễn dưới dạng vector hàng và vector cột khi làm việc với ma trận. Ngoài ra, trong đại số tuyến tính, vector sử dụng các khái niệm hiệp phương sai và phản hiệp phương sai. Những khái niệm này không tạo ra sự khác biệt khi viết mã MQL5, vì chỉ có lập trình viên quyết định mỗi đối tượng của kiểu vector là gì. Ví dụ, nó có thể là vector quay, vector dịch chuyển hoặc vector nén trong đồ họa 3D.
Nói chung, từ quan điểm của đại số tuyến tính, một số cũng là một vector, nhưng trong không gian vector một chiều. Bản thân vector có thể được xem như một trường hợp đặc biệt của ma trận.
Kiểu matrix
là một kiểu dữ liệu đặc biệt khác trong MQL5 để biểu diễn ma trận. Ma trận thực chất là một mảng hai chiều có kiểu double. Vector và ma trận đã được đưa vào MQL5 để đơn giản hóa các thao tác với một số loại tập dữ liệu nhất định. Với chúng, các nhà phát triển có thể tận dụng các khả năng của đại số tuyến tính một cách đơn giản và gần với dạng toán học. Ma trận có thể được sử dụng để viết gọn hệ phương trình tuyến tính hoặc vi phân. Số hàng của ma trận tương ứng với số phương trình, trong khi số cột bằng số ẩn số. Kết quả là, hệ phương trình tuyến tính có thể được giải thông qua các phép toán ma trận.
Có các kiểu dữ liệu sau:
matrix
— một ma trận chứa các phần tử kiểu double.matrixf
— một ma trận chứa các phần tử kiểu float.matrixc
— một ma trận chứa các phần tử kiểu complex.vector
— một vector chứa các phần tử kiểu double.vectorf
— một vector chứa các phần tử kiểu float.vectorc
— một vector chứa các phần tử kiểu complex.
Các hàm mẫu hỗ trợ các ký hiệu như matrix<double>
, matrix<float>
, vector<double>
, vector<float>
thay cho các kiểu tương ứng.
Các phép toán đại số sau được định nghĩa cho ma trận:
- Cộng các ma trận cùng kích thước.
- Nhân các ma trận có kích thước phù hợp: số cột của ma trận bên trái phải bằng số hàng của ma trận bên phải.
- Nhân ma trận với vector cột; nhân vector hàng với ma trận theo quy tắc nhân ma trận. Theo nghĩa này, vector là một trường hợp đặc biệt của ma trận.
- Nhân ma trận với một số, tức là với một scalar.
Toán học xem xét nhiều loại ma trận khác nhau. Ví dụ, ma trận đơn vị, ma trận đối xứng, ma trận lệch đối xứng, ma trận tam giác trên và dưới, và các loại khác. Các dạng chuẩn đóng vai trò quan trọng trong lý thuyết ma trận. Chúng đại diện cho một dạng chuẩn tắc nhất định của ma trận, có thể đạt được thông qua một số phép biến đổi nhất định. Trong thực tế, các dạng chuẩn có thêm các tính chất, chẳng hạn như độ ổn định, được sử dụng.
Việc sử dụng vector và ma trận, hay đúng hơn là các phương thức đặc biệt của các kiểu liên quan, cho phép tạo ra mã đơn giản hơn, ngắn gọn hơn và rõ ràng hơn, gần với ký hiệu toán học. Với các phương thức này, bạn có thể tránh việc tạo các vòng lặp lồng nhau hoặc phải chú ý đến việc lập chỉ số mảng chính xác trong các phép tính. Do đó, việc sử dụng các phương thức này tăng độ tin cậy và tốc độ trong việc phát triển các chương trình phức tạp.
Danh sách các phương thức ma trận và vector
Kiểu matrix
và vector
bao gồm các phương thức tương ứng với các phương thức của thư viện NumPy. Sử dụng các phương thức này, bạn có thể chuyển đổi các thuật toán và mã từ Python sang MQL5 với nỗ lực tối thiểu. Nhiều tác vụ xử lý dữ liệu, phương trình toán học, mạng nơ-ron và các tác vụ học máy có thể được giải quyết bằng các phương thức và thư viện Python có sẵn.
Phương thức matrix/vector | Phương thức tương tự trong NumPy | Mô tả |
---|---|---|
void matrix.Eye(const int rows, const int cols, const int ndiag=0) | eye | Tạo một ma trận với các số 1 trên đường chéo và số 0 ở các vị trí khác |
void matrix.Identity(const int rows) | identity | Tạo một ma trận vuông với các số 1 trên đường chéo chính |
void matrix.Ones(const int rows, const int cols) | ones | Tạo một ma trận mới với số hàng và cột đã cho, điền đầy bằng số 1 |
void matrix.Zeros(const int rows, const int cols) | zeros | Tạo một ma trận mới với số hàng và cột đã cho, điền đầy bằng số 0 |
void matrix.Full(const int rows, const int cols, const scalar value) | full | Tạo một ma trận mới với số hàng và cột đã cho, điền đầy bằng giá trị scalar |
void matrix.Copy(const matrix a) | copy | Tạo một bản sao của ma trận đã cho |
void matrix.FromBuffer(const int rows, const int cols, const scalar array[], const int count=-1, const int offset=0) | frombuffer | Tạo một ma trận từ một mảng 1 chiều |
void matrix.FromFile(const int rows, condt int cols, const int file_handle, const int count=-1, const int offset=0) | fromfile | Tạo một ma trận từ dữ liệu trong tệp văn bản hoặc nhị phân |
void vector.FromString(const string source, const string sep=" ") | fromstring | Tạo một vector được khởi tạo từ dữ liệu văn bản trong một chuỗi |
void vector.Arange(const scalar start, const scalar stop, const scalar step=1) | arange | Tạo các giá trị cách đều nhau trong một khoảng cho trước |
void matrix.Diag(const vector v, const int ndiag=0) | diag | Trích xuất một đường chéo hoặc tạo một ma trận đường chéo |
void matrix.Tri(const int rows, const int cols, const int ndiag=0) | tri | Tạo một ma trận với số 1 tại và dưới đường chéo đã cho và số 0 ở các vị trí khác |
void matrix.Tril(const int rows, const int cols, const scalar array[], const int ndiag=0) | tril | Trả về một bản sao của ma trận với các phần tử phía trên đường chéo thứ k bị đặt về 0 |
void matrix.Triu(const int rows, const int cols, const scalar array[], const int ndiag=0) | triu | Trả về một bản sao của ma trận với các phần tử phía dưới đường chéo thứ k bị đặt về 0 |
void matrix.Vander(const vector v, const int cols=-1, const bool increasing=false) | vander | Tạo một ma trận Vandermonde |
vector matrix.Row(const unsigned nrow) | Trả về một vector hàng | |
vector matrix.Col(const unsigned ncol) | Trả về một vector cột | |
unsigned matrix.Rows() | Trả về số hàng trong ma trận | |
unsigned matrix.Cols() | Trả về số cột trong ma trận | |
void matrix.Init() | Khởi tạo một ma trận | |
matrix matrix.Transpose() | transpose | Đảo ngược hoặc hoán vị các trục của ma trận; trả về ma trận đã sửa đổi |
matrix matrix.Dot(const matrix b) | dot | Tích vô hướng của hai ma trận |
matrix matrix.Inner(const matrix b) | inner | Tích trong của hai ma trận |
matrix matrix.Outer(const matrix b) | outer | Tính tích ngoài của hai ma trận |
matrix matrix.MatMul(const matrix b) | matmul | Tích ma trận của hai ma trận |
matrix matrix.MatrixPower(const int power) | matrix_power | Nâng một ma trận vuông lên lũy thừa (số nguyên) n |
matrix matrix.Kron(const matrix b) | kron | Trả về tích Kronecker của hai ma trận |
bool matrix.Cholesky(matrix& L) | cholesky | Trả về phân tích Cholesky |
bool matrix.QR(matrix& Q, matrix& R) | qr | Tính phân tích qr của một ma trận |
bool matrix.SVD(matrix& U, matrix& V, vector& singular_values) | svd | Phân tích giá trị đơn |
bool matrix.Eig(matrix& eigen_vectors, vector& eigen_values) | eig | Tính các giá trị riêng và vector riêng bên phải của một ma trận vuông |
bool matrix.EigH(matrix& eigen_vectors, vector& eigen_values) | eigh | Trả về các giá trị riêng và vector riêng của một ma trận Hermitian |
bool matrix.EigVals(vector& eigen_values) | eigvals | Tính các giá trị riêng của một ma trận tổng quát |
bool matrix.EigValsH(vector& eigen_values) | eigvalsh | Tính các giá trị riêng của một ma trận Hermitian |
bool matrix.LU(matrix& L, matrix& U) | Phân tích LU của một ma trận dưới dạng tích của một ma trận tam giác dưới và một ma trận tam giác trên | |
bool matrix.LUP(matrix& L, matrix& U, matrix& P) | Phân tích LUP với hoán vị từng phần, liên quan đến phân tích LU chỉ với các hoán vị hàng: PA=LU | |
double matrix.Norm(const norm) | norm | Trả về norm của ma trận hoặc vector |
double matrix.Cond(const norm) | cond | Tính số điều kiện của một ma trận |
vector matrix.Spectrum() | Tính phổ của một ma trận dưới dạng tập hợp các giá trị riêng từ tích AT*A | |
double matrix.Det() | det | Tính định thức của một mảng |
int matrix.Rank() | matrix_rank | Trả về hạng ma trận của mảng bằng phương pháp Gauss |
int matrix.SLogDet(int& sign) | slogdet | Tính dấu và logarit của định thức của một mảng |
double matrix.Trace() | trace | Trả về tổng dọc theo các đường chéo của ma trận |
vector matrix.Solve(const vector b) | solve | Giải một phương trình ma trận tuyến tính, hoặc hệ phương trình đại số tuyến tính |
vector matrix.LstSq(const vector b) | lstsq | Trả về nghiệm bình phương tối thiểu của các phương trình đại số tuyến tính (cho ma trận không vuông hoặc suy biến) |
matrix matrix.Inv() | inv | Tính nghịch đảo (nhân) của một ma trận |
matrix matrix.PInv() | pinv | Tính nghịch đảo giả của một ma trận bằng phương pháp Moore-Penrose |
int matrix.Compare(const matrix matrix_c, const double epsilon) int matrix.Compare(const matrix matrix_c, const int digits) int vector.Compare(const vector vector_c, const double epsilon) int vector.Compare(const vector vector_c, const int digits) | So sánh các phần tử của hai ma trận/vector với độ chính xác được chỉ định | |
double matrix.Flat(const ulong index) bool matrix.Flat(const ulong index, const double value) | flat | Cho phép định địa chỉ một phần tử ma trận thông qua một chỉ số thay vì hai |
double vector.ArgMax() double matrix.ArgMax() vector matrix.ArgMax(const int axis) | argmax | Trả về chỉ số của giá trị lớn nhất |
double vector.ArgMin() double matrix.ArgMin() vector matrix.ArgMin(const int axis) | argmin | Trả về chỉ số của giá trị nhỏ nhất |
double vector.Max() double matrix.Max() vector matrix.Max(const int axis) | max | Trả về giá trị lớn nhất trong ma trận/vector |
double vector.Mean() double matrix.Mean() vector matrix.Mean(const int axis) | mean | Tính trung bình cộng của các giá trị phần tử |
double vector.Min() double matrix.Min() vector matrix.Min(const int axis) | min | Trả về giá trị nhỏ nhất trong ma trận/vector |
double vector.Sum() double matrix.Sum() vector matrix.Sum(const int axis) | sum | Trả về tổng các phần tử của ma trận/vector, cũng có thể thực hiện cho trục đã cho |
void vector.Clip(const double min_value, const double max_value) void matrix.Clip(const double min_value, const double max_value) | clip | Giới hạn các phần tử của ma trận/vector trong một phạm vi giá trị hợp lệ được chỉ định |
vector vector.CumProd() vector matrix.CumProd() matrix matrix.CumProd(const int axis) | cumprod | Trả về tích lũy của các phần tử ma trận/vector, bao gồm cả dọc theo trục đã cho |
vector vector.CumSum() vector matrix.CumSum() matrix matrix.CumSum(const int axis) | cumsum | Trả về tổng lũy của các phần tử ma trận/vector, bao gồm cả dọc theo trục đã cho |
double vector.Prod(const double initial=1) double matrix.Prod(const double initial=1) vector matrix.Prod(const int axis, const double initial=1) | prod | Trả về tích của các phần tử ma trận/vector, cũng có thể thực hiện cho trục đã cho |
void matrix.Reshape(const ulong rows, const ulong cols) | reshape | Thay đổi hình dạng của ma trận mà không thay đổi dữ liệu của nó |
void matrix.Resize(const ulong rows, const ulong cols) | resize | Trả về một ma trận mới với hình dạng và kích thước đã thay đổi |
bool matrix.SwapRows(const ulong row1, const ulong row2) | Hoán đổi các hàng trong ma trận | |
bool matrix.SwapCols(const ulong col1, const ulong col2) | Hoán đổi các cột trong ma trận | |
double vector.Ptp() double matrix.Ptp() vector matrix.Ptp(const int axis) | ptp | Trả về phạm vi giá trị của ma trận/vector hoặc của trục ma trận đã cho, tương đương với Max() - Min() |
double vector.Percentile(const int percent) double matrix.Percentile(const int percent) vector matrix.Percentile(const int percent, const int axis) | percentile | Trả về phân vị được chỉ định của các giá trị phần tử ma trận/vector hoặc các phần tử dọc theo trục đã chỉ định. Giá trị hợp lệ của tham số percent nằm trong khoảng [0, 100] |
double vector.Quantile(const int percent) double matrix.Quantile(const int percent) vector matrix.Quantile(const int percent, const int axis) | quantile | Trả về phân vị được chỉ định của các giá trị phần tử ma trận/vector hoặc các phần tử dọc theo trục đã chỉ định. Tham số percent nhận giá trị trong khoảng [0, 1] |
double vector.Median() double matrix.Median() vector matrix.Median(const int axis) | median | Tính giá trị trung vị của các phần tử ma trận/vector. Trung vị là giá trị giữa phân tách nửa cao nhất của các phần tử mảng/vector với nửa thấp nhất của các phần tử |
double vector.Average() double matrix.Average() vector matrix.Average(const int axis) | average | Tính trung bình cộng của các giá trị ma trận/vector. Tổng các trọng số trong mẫu số không được bằng 0, nhưng một số trọng số có thể bằng 0 |
double vector.Std() double matrix.Std() vector matrix.Std(const int axis) | std | Trả về độ lệch chuẩn của các giá trị phần tử ma trận/vector hoặc của các phần tử dọc theo trục đã cho |
double vector.Var() double matrix.Var() vector matrix.Var(const int axis) | var | Tính phương sai của các giá trị phần tử ma trận/vector |
double vector.CorrCoef(const vector& v) matrix matrix.CorrCoef() | corrcoef | Tính hệ số tương quan Pearson (hệ số tương quan tuyến tính). Hệ số tương quan nằm trong khoảng [-1, 1] |
vector vector.Correlate(const vector& v, enum mode) | correlate | Tính tương quan chéo của hai vector. Tham số mode xác định chế độ tính toán chập tuyến tính |
vector vector.Convolve(const vector& v, enum mode) | convolve | Trả về chập tuyến tính rời rạc của hai vector. Tham số mode xác định chế độ tính toán chập tuyến tính |
matrix matrix.Cov() matrix vector.Cov(const vector& v); (ma trận kết quả 2 x 2) | cov | Tính ma trận hiệp phương sai. Hiệp phương sai của hai mẫu (hai biến ngẫu nhiên) là thước đo sự phụ thuộc tuyến tính của chúng |