Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 27.01.2020
Сообщений: 5

Матрица в матрице

28.01.2020, 18:01. Показов 1276. Ответов 9

Студворк — интернет-сервис помощи студентам
Ребята, всем привет, надеюсь здесь есть еще кто живой. Подскажите пожалуйста хотя бы с алгоритмом. Есть произвольный двумерный массив с рандомными числами. Как в нем "вырезать" квадратную матрицу с наибольшей суммой диагональных элементов?
Можно сделать несколько итераций и найти "наибольшую диагональ", далее можно найти какая из диагоналей максимальна, но как вывести матрицу чьей будет эта диагональ? Может у кого-нибудь есть мысли наводящие?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.01.2020, 18:01
Ответы с готовыми решениями:

Красивая матрица вывести все сведения о матрице
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using...

Даны массив А=(а1,а2...а10) и матрица В(n*n). заменить нулями в матрице....
Напишите пожалуйста, очень нужно для практики Даны массив А=(а1,а2...а10) и матрица В(n*n). заменить нулями в матрице те элементы с...

Дана матрица. Определить есть ли одинаковые элементы в матрице
Дана матрица. Определить есть ли одинаковые элементы в матрице. Использовать Function.

9
28.01.2020, 18:07

Не по теме:

Цитата Сообщение от DenilOK Посмотреть сообщение
надеюсь здесь есть еще кто живой.
внизу форума на странице есть присутствующие, так же как и внизу каждой темы.

0
Злостный нарушитель
 Аватар для Verevkin
10357 / 5772 / 1274
Регистрация: 12.03.2015
Сообщений: 26,668
28.01.2020, 18:40
Цитата Сообщение от DenilOK Посмотреть сообщение
Может у кого-нибудь есть мысли наводящие?
начни с функции вычисления суммы диагональных элементов:
C++
1
2
3
4
int diag_sum(unsigned row, unsigned col, int** matrix, unsigned matr_size)
{
  // тут 100500 строк лютого говнокода :))
}
0
0 / 0 / 0
Регистрация: 27.01.2020
Сообщений: 5
30.01.2020, 14:02  [ТС]
Прекрасный ответ! Я говорю что можно найти суммы диагоналей, но что дальше - вы отвечаете, что можно начать с подсчета суммы диагоналей... полезно
0
Злостный нарушитель
 Аватар для Verevkin
10357 / 5772 / 1274
Регистрация: 12.03.2015
Сообщений: 26,668
30.01.2020, 14:18
Цитата Сообщение от DenilOK Посмотреть сообщение
но что дальше - вы отвечаете, что можно начать с подсчета суммы диагоналей... полезно
Не с подсчёта суммы, а
Цитата Сообщение от Verevkin Посмотреть сообщение
с функции вычисления суммы диагональных элементов
Функцию, говорю, напиши.
0
30 / 21 / 9
Регистрация: 29.10.2019
Сообщений: 79
30.01.2020, 17:19
попробую, но предупреждаю - я нуб. НО уголки не считались(они же не матрица=\), только потом подумалось, что надо бы считать. Наверное и самую длинную диагональ не стоило бы считать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <ctime>
#include<cstdlib>
#include<algorithm>
 
int main()
{srand(static_cast<unsigned int>(time(0))); 
std::cout<<"enter size of the square matrix: ";int size;std::cin>>size;
 
int arr[size][size];
for(int i=0;i<size;++i)//заполняем матрицу рандомно от 1 до 9 и выводим
{for(int &ref:arr[i])
{ref=rand()%9+1;std::cout<<ref<<' ';}
std::cout<<'\n';}
 
int numDiag=size*2-3;//колво диагоналей кроме уголков
int maxDiagArr[numDiag];//массив для хранения значений диагоналей
for(int i=0;i<numDiag;++i)//массив заполняем нулями
maxDiagArr[i]=0;
 
int max=0;//максимальная сумма
int startRow,startCol,newSize;//координаты новой матрицы
 
for(int i=0;i<size;++i)
{
for(int j=i, index=0;j<size;++j,++index)
{//считаем суммы по диагонали. 
if(index<numDiag/2)
{maxDiagArr[index]+=arr[i][j];//это верхние диагонали справа налево, идут в массив с начала
maxDiagArr[numDiag-index-1]+=arr[j][i];//нижние диагонали снизу вверх, идут в массив с конца
 
if(max<maxDiagArr[index])//вычисляется максимальный элемент и координаты новой матрицы
{max=maxDiagArr[index];startRow=index,startCol=0,newSize=size-startRow;}
else if(max<maxDiagArr[numDiag-index-1])
{max=maxDiagArr[numDiag-index-1];startRow=0,startCol=index,newSize=size-startCol;}}
} }
 
//тут для ясности вывод максимальной диагонали
std::cout<<"\n\nMax diagonal is "<<max<<". Coordinates of a new matrix: column "<<startCol<<", row "<<startRow<<". The size is: "<<newSize<<'\n';
 
for(int i=startCol,size=0;size<newSize;++i,++size)//тут вывод матрицы (но не вырезанной)
    {     for(int j=startRow,sizej=0;sizej<newSize;++j,++sizej)
        std::cout<<arr[i][j]<<' ';
        std::cout<<'\n';}  
    return 0;
}
Добавлено через 24 минуты
пару моментов исправить
0
694 / 304 / 99
Регистрация: 04.07.2014
Сообщений: 851
30.01.2020, 18:55
Цитата Сообщение от Zashiki Посмотреть сообщение
C++
1
2
3
int size;
std::cin>>size;
int arr[size][size];
Опасная конструкция. В такой ситуации arr - массив переменной длины массивов переменной длины. Это вне стандарта С++, но такое есть в стандарте Си. Его можно использовать только для локальных переменных, нельзя передать в функции или из них.

Внимательно посмотри как делают динамические многомерные массивы.

Но я бы рекомендовал написать свой класс Matrix (например, как это сделано в Eigen) и несколько функций к нему, что бы можно было писать код так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
  Matrix A(10, 10);
  A(0, 0) = 3.1415;
  A(0, 1) = 4.5678;
  print(A);
 
  Matrix B = A.subMatrix(0, 0, 2, 2);
  print(B);
 
  return 0;
}


Например так:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
class Matrix {
public:
  Matrix(size_t rows, size_t cols)
      : m_rows(rows), m_cols(cols), m_data(rows * cols)
  {
  }
 
  size_t rows() const
  {
    return m_rows;
  }
 
  size_t cols() const
  {
    return m_cols;
  }
 
  const double &operator()(size_t row, size_t col) const
  {
    return m_data[row * m_cols + col];
  }
 
  double &operator()(size_t row, size_t col)
  {
    return m_data[row * m_cols + col];
  }
 
  Matrix subMatrix(size_t row_from,
                   size_t col_from,
                   size_t row_to,
                   size_t col_to)
  {
    if (row_from > row_to) {
      std::swap(row_from, row_to);
    }
    if (col_from > col_to) {
      std::swap(col_from, col_to);
    }
    size_t new_rows = row_to - row_from + 1;
    size_t new_cols = col_to - col_from + 1;
    Matrix result(new_rows, new_cols);
    for (size_t i = 0; i < new_rows; ++i) {
      for (size_t j = 0; j < new_cols; ++j) {
        result(i, j) = (*this)(row_from + i, col_from + j);
      }
    }
    return result;
  }
 
private:
  size_t              m_rows;
  size_t              m_cols;
  std::vector<double> m_data;
};
 
 
 
void print(const Matrix &A)
{
  for (size_t i = 0; i < A.rows(); ++i) {
    for (size_t j = 0; j < A.cols(); ++j) {
      std::cout << A(i, j) << " ";
    }
    std::cout << "\n";
  }
}


Добавлено через 4 минуты
И ещё момент, в рамках задачи какая подматрица будет искомой для:
Code
1
2
3
4
-1 -1 -1 -1
-1  2  2 -1
-1  2  2 -1
-1 -1 -1 -1
Что-то мне кажется, что ответ должен быть:
Code
1
2
2 2
2 2
0
30 / 21 / 9
Регистрация: 29.10.2019
Сообщений: 79
30.01.2020, 19:10
Но я бы рекомендовал написать свой класс Matrix (например, как это сделано в Eigen) и несколько функций к нему, что бы можно было писать код так:
у меня было в классе. Но я только учу классы, поэтому вышел сложный фрик, и изменено на фрика попроще. Буду изучать ваши подсказки, спасибо
0
694 / 304 / 99
Регистрация: 04.07.2014
Сообщений: 851
30.01.2020, 19:16
Цитата Сообщение от Zashiki Посмотреть сообщение
поэтому вышел сложный фрик,
Не спиши реализовывать все методы. Делай только те которые сейчас используешь, даже если тебе кажется, что они могут понадобиться.
0
30 / 21 / 9
Регистрация: 29.10.2019
Сообщений: 79
30.01.2020, 19:34
C++
1
else if(max<maxDiagArr[numDiag-index-1])
у меня ошибка кстати, надо просто
C++
1
if(max<maxDiagArr[numDiag-index-1])
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.01.2020, 19:34
Помогаю со студенческими работами здесь

Модули. Матрица. Есть ли в матрице столбец только с положительными элементами
нам плохо объясняют модули.сделала как смогла.естественно не работает.помогите где косяки,буду очень признательна. условие:Дана...

Проверить, является ли матрица A обратной к B (в таком случае A*B = единичной матрице)
Проверить, является ли матрица В(n,n) обратной к A(n,n). Произведением матриц А и В в этом случае должна быть единичная матрица.

Дана Квадратная матрица A(N,N). В матрице определить наибольший и наименьший элементы с индексами
Составить программу с использованием операторов цикла. Дана Квадратная матрица A(N,N). В матрице определить наибольший и наименьший...

Дана матрица N*N. Как реализовать перемещение по матрице без участия пользователя?
Дан двумерный массив 20*20 типа int, инициализированный(пустое место). На нем случайным образом расположено N элементов типа int,...

Осуществить циклический сдвиг в матрице каждого столбца на n разрядов (разреженная матрица)
помогите пожалуйста написать прогу) Дана разреженная матрицы общего вида (CSS или CSR). Осуществить циклический сдвиг в матрице каждого...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru