Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.10.2019, 12:21   #1
archerix
Форумчанин
 
Регистрация: 13.09.2019
Сообщений: 119
По умолчанию [C++] Передать матрицу любой размерности как параметр функции в С++

Наверное, в помощи студентам будет в самый раз - хоть давно уже не студент, но С++ только начал, так что вопрос, наверное, наивный

Делаю небольшую задачку по вычислению обратной матрицы. Для этого мне надо вычислять детерминанты как самой матрицы, так и ее миноров. Написал функцию, вычисляющую детерминант, и столкнулся с неожиданной проблемой: хотелось бы, чтобы ее можно было натравить на любую квадратную матрицу, переданную как параметр. Но с этим в С++, похоже, есть сложности. Порылся в гугле, нарыл несколько хитрых решений, остановился на таком вот понравившемся и вроде простом:

const int N=5;

int mas[5][5]={{1,2,3,4,5},
{1,2,3,4,5},
{1,2,3,4,5},
{1,2,3,4,5},
{1,2,3,4,5}};


void Transdet(int k, int (& mas)[N][N]);

Вроде бы все работало с исходной матрицей. Но когда попытался потом посчитать с ее помощью минор, работать отказалась – напрягши моск, пришел к выводу, что из-за несовпадения размерности, минор-то меньше исходной матрицы. Если задавать размерность как константу или просто прописывать размерность в скобках явно, можно передавать любую матрицу этой же размерности. Можно ли тут как-то схитрить или такой способ для массивов разной размерности не годится в принципе? Если это важно, сама функция еще и вызывается рекурсионно.

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

Последний раз редактировалось archerix; 24.10.2019 в 12:48.
archerix вне форума Ответить с цитированием
Старый 25.10.2019, 11:45   #2
archerix
Форумчанин
 
Регистрация: 13.09.2019
Сообщений: 119
По умолчанию

Отвечу сам - как вариант, описываем матрицу для миноров в полном размере, а вместе с матрицей в функцию передаем отдельный параметр, указывающий, что считать ее надо "не до конца".
Но другие варианты тоже интересно было бы узнать.

Последний раз редактировалось archerix; 25.10.2019 в 11:47.
archerix вне форума Ответить с цитированием
Старый 25.10.2019, 11:53   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Передавать указатель и размеры, написать свою обертку или взять вектор из стл, glm и т.д.
p51x вне форума Ответить с цитированием
Старый 25.10.2019, 12:06   #4
archerix
Форумчанин
 
Регистрация: 13.09.2019
Сообщений: 119
По умолчанию

Пока что мне это ничего не говорит, но я почитаю
archerix вне форума Ответить с цитированием
Старый 25.10.2019, 12:16   #5
archerix
Форумчанин
 
Регистрация: 13.09.2019
Сообщений: 119
По умолчанию

Первый пункт - это вот так вот? Нашел в тырнете.

template <int row, int col>
void funArray(int (&arr)[row][col])
{
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++)
cout << arr[i][j] << " ";
cout << endl;
}
}
archerix вне форума Ответить с цитированием
Старый 25.10.2019, 12:33   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Причем тут шаблоны?

Код:
#include <iostream>

void funArray(int arr[], std::size_t m, std::size_t n)
{
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++)
            std::cout << arr[i*m + j] << " ";
        std::cout << std::endl;
    }
}

int main() {
	int a[5][5] = { { 1, 2, 3, 4, 5 }, { 1, 2, 3, 4, 5 }, { 1, 2, 3, 4, 5 }, { 1, 2, 3, 4, 5 }, { 1, 2, 3, 4, 5 } };
	int b[4][4] = { { 1, 2, 3, 4 }, { 1, 2, 3, 4 }, { 1, 2, 3, 4 }, { 1, 2, 3, 4 } };
	
	funArray(reinterpret_cast<int*>(a), 5, 5);
	funArray(reinterpret_cast<int*>(b), 4, 4);
}
p51x вне форума Ответить с цитированием
Старый 25.10.2019, 12:41   #7
archerix
Форумчанин
 
Регистрация: 13.09.2019
Сообщений: 119
По умолчанию

Значит, ошибся по незнанию Но оно исправно передает любую матрицу и выглядит не слишком сложным в применении
С этим способом тоже разберусь, спасибо.

Код:
#include <iostream>
using namespace std;

int mas5[5][5]={{0,2,3,4,5},
               {1,1,3,4,5},
               {1,2,2,4,5},
               {1,2,3,3,5},
               {1,2,3,4,4}};


int mas8[8][8]={{1, 3, 5, -1, 7, 2, 1, 5},
               {2, 6, 8, -2, 4, 3, 2, 2},
               {-1, -4, 5, 1,9, 4, 3, 4},
               {9, 2, -5, 6, 1, 1, 4, -3},
               {-9, 5, 3, 2, 7, 5, 5,1},
               {2, 5, 4, 7, 6, 8, 6, 7},
               {3, 5, 4, 4, 6, 7, 6, 5},
               {6, 1, 1,4, 6, 9, 2, 3}};


int mas7[7][7]={{1,3,5,-1,7,2,1},
               {2,6,8,-2,4,3,2},
               {-1,-4,5,1,9,4,3},
               {9,2,-5,6,1,1,4},
               {-9,5,3,2,7,5,5},
               {2,5,4,7,6,8,6},
               {3,5,4,4,6,7,6}};

int mas3[3][3]={{1,3,5},
               {2,6,8},
               {-1,-4,5}};

template <int row, int col>
void funArray(int a, int (&arr)[row][col])
{
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++)
cout << arr[i][j] << " ";
cout << endl;
}
cout << endl;
cout << a;
}


int main()
{
funArray(1, mas5);
return 0;
}
archerix вне форума Ответить с цитированием
Старый 25.10.2019, 12:43   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
Сообщение от archerix Посмотреть сообщение
Но оно исправно передает любую матрицу и выглядит не слишком сложным в применении
Угу, только надо понимать, что происходит и что будет сгенерировано.
p51x вне форума Ответить с цитированием
Старый 25.10.2019, 12:47   #9
archerix
Форумчанин
 
Регистрация: 13.09.2019
Сообщений: 119
По умолчанию

Почитаем теорию

А какой способ лично вы считаете оптимальным - тот, что в вашем примере?
archerix вне форума Ответить с цитированием
Старый 26.10.2019, 07:48   #10
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

archerix, вектора достаточно. Для неквадратной матрицы - вектор и длина строки

std::vector<int> m_matrix;

если не разберёшься - скинь скайп в ЛС, объясню
Алексей1153 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написать программу, которая создает динамическую матрицу размерности A[nxn] Ivanrik Общие вопросы C/C++ 0 25.11.2018 09:03
сгенерировать матрицу размерности М х К из случайных вещественных чисел из интервала [-25,40] AVIM Общие вопросы C/C++ 1 12.02.2016 23:00
Как передать параметр функции в const? Mik92 Общие вопросы Delphi 8 01.12.2014 16:56
Заполнить матрицу Р размерности m x n значениями элементов вектора Q размерности k = m x n Olevander Помощь студентам 0 23.11.2014 10:09
функция, способная сгенерировать массив любой размерности. papapapokerface Общие вопросы C/C++ 2 03.06.2010 14:33