Я улучшил свой предыдущий класс N-dim Matrix (C ++ 20: N-мерный минимальный класс Matrix), добавив некоторую ключевую функцию из NumPy: широковещательную передачу матрицы!
Широковещание — это ключевая необходимая функция для приема входных данных, возможно, различной формы в матричных бинарных операторах.
https://github.com/onnx/onnx/blob/master/docs/Broadcasting.md
Реализованы только базовые бинарные дополнения (sub, mul, div, …), другие бинарные операторы (меньше, больше, xor, …) аналогичны шаблонам.
Поскольку мой код раздувается, я размещу здесь ссылку на GitHub с заметными изменениями по сравнению с предыдущей версией:
https://github.com/frozenca/Ndim-Matrix/blob/main/ObjectBase.h
https://github.com/frozenca/Ndim-Matrix/blob/main/MatrixBase.h#L309
https://github.com/frozenca/Ndim-Matrix/blob/main/Matrix.h#L319
https://github.com/frozenca/Ndim-Matrix/blob/main/MatrixUtils.h#L56
https://github.com/frozenca/Ndim-Matrix/blob/main/MatrixUtils.h#L199
Простой тест вещания:
#include "Matrix.h"
#include <iostream>
#include <iterator>
#include <numeric>
int main() {
auto m6 = frozenca::ones<double, 3>({2, 3, 3});
// {{{1, 1, 1}, {1, 1, 1}, {1, 1, 1}}, {{1, 1, 1}, {1, 1, 1}, {1, 1, 1}}}
std::cout << m6 << 'n';
auto m7 = frozenca::zeros<int, 2>({1, 3});
std::iota(std::begin(m7), std::end(m7), 1);
// {{1, 2, 3}}
std::cout << m7 << 'n';
auto m8 = m6 + m7; // type: Matrix<double, 3> with size (2, 3, 3)
// {{{2, 3, 4}, {2, 3, 4}, {2, 3, 4}}, {{2, 3, 4}, {2, 3, 4}, {2, 3, 4}}}
std::cout << m8 << 'n';
}
Не стесняйтесь комментировать что угодно!
Еще впереди: линейная алгебра (.dot (), .matmul (), SVD, обратная / псевдообратная и т. Д.)