C ++ 20: N-dim матрица версии 2, широковещательные бинарные операторы

Я улучшил свой предыдущий класс 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, обратная / псевдообратная и т. Д.)

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *