Библиотека как функция с нуля для умножения матриц в C ++ - PullRequest
0 голосов
/ 29 февраля 2020

Здесь я пытаюсь написать библиотечную функцию для умножения матриц. И эта функция должна поддерживать все типы данных, такие как float, int, et c. Вот почему я использовал шаблон здесь. Но мне трудно передавать 2-мерные массивы в функцию.

Q) void matrix_mul(T a[][2], T b[][2], T c[][2], ll p, ll q, ll r) как я могу передать 2-мерные массивы без необходимости передавать второй параметр, т. Е. T a[][2]?

Q) Я хочу записать эти функции в другой файл и затем импортировать его в основной файл, точно так же, как мы импортируем стандартные библиотеки?

PS: я новичок в CPP. Пожалуйста, направьте меня к ресурсам, если на эти вопросы уже дан ответ. TIA

template <class T>
void matrix_mul(T a[][2], T b[][2], T c[][2], ll p, ll q, ll r){
    for (ll i = 0; i < p; ++i)
        for (ll j = 0; j < q; ++j)
            for (ll k = 0; k < r; ++k)
                c[i][j] += a[i][k] * b[k][j];
}
int main(){
    io;
    ll p = 2, q = 2, r = 2;
    ll a[2][2] = {{1, 1}, {1, 1}};
    ll b[2][2] = {{1, 1}, {1, 1}};
    ll c[2][2] = {0};

    for (ll i = 0; i < p; ++i)
        for (ll j = 0; j < r; ++j)
            c[i][j] = 0;

    matrix_mul(a, b, c, p, q, r);

    for (ll i = 0; i < p; ++i){
        for (ll j = 0; j < r; ++j)
            cout << c[i][j] << "\t";
        cout << nl;
    }
    return 0;   
}

ОБНОВЛЕНИЕ : После чтения C ++ я смог найти рабочее решение (см. Ниже).

Ответы [ 2 ]

0 голосов
/ 09 марта 2020

Вот как я решаю вышеуказанную проблему -

  • Определение шаблона в файле заголовка.
  • Импорт указанного файла заголовка в основной файл. cpp #include "mat.hpp".
  • Использование векторного представления для преодоления спецификации размера.

Я разместил полное решение здесь https://github.com/ssp4all/Matrix-Multiplication-and-Transpose

0 голосов
/ 29 февраля 2020

Q) void matrix_mul (T a [] [2], T b [] [2], T c [] [2], ll p, ll q, ll r), как я могу передать 2d массивы без необходимости передавать второй параметр, т. е. T a [] [2]?

Использовать ссылки и размер каждого размера в качестве других параметров шаблона

template<class T, ll  N, ll M>
void matrix_mul(T (&a)[N][2], T (&b)[N][M], T (&c)[N][M], ll p, ll q, ll r)

Значения для этих параметров будет выведен так же, как и тип.

В) Я хочу записать эти функции в другой файл, а затем импортировать его в основной файл, точно так же, как мы импортируем стандартные библиотеки?

В стандартных библиотеках все шаблоны определены в заголовочных файлах, а не в единицах перевода, которые компилируются в связанные объектные файлы. Таким образом, вы должны хранить встроенную реализацию в заголовочном файле, а не в файле. cpp.

export template должен был решить эту проблему, но он никогда не работал и был удален из C ++.

Один из возможных способов - создать экземпляр шаблона со всеми необходимыми типами. cpp и оставить в заголовке только объявление, но тогда произойдет сбой с параметрами, которые вы не предусмотрели. Для вашего случая это не вариант, так как вам нужно предусмотреть все типы и всех размеров.

...