Как найти элементы выше главной диагонали матрицы

Мы все знаем, как найти элементы выше главной диагонали в квадратной матрице. А что если матрица не квадратная, а просто прямоугольная и как найти в ней все элементы выше главной диагонали? Обычным if (i <= j) не обойдешься.

Допустим есть такой код, который делает все элементы выше диагонали 0, остальные — рандомные:

int n = 10;
int m = 16;

int** arr = (int**)malloc(sizeof(int*)*m);

for (int i = 0; i < m; i++)
{
    arr[i] = (int*)malloc(sizeof(int)*n);
}

for (int i = 0; i < m; i++)
{
    for (int j = 0; j < n; j++)
    {
        arr[i][j] = rand() % 9 + 1;

        if (i <= j) //Какое-то корректное условие вместо данного
        {
            arr[i][j] = 0;
        }

        printf("%d ", arr[i][j]);
    }
    printf("n");

}

Как правильно решить такую задачу?

Kromster's user avatar

Kromster

13.5k12 золотых знаков43 серебряных знака72 бронзовых знака

задан 30 апр 2017 в 20:17

Владислав's user avatar

9

Если понимать искомую разделительную линию здесь, как диагональ прямоугольника, то можно предложить следующий подход:

 if (i * n < j * m) 
    arr[i][j] = 2;  //выше диагонали
 else if (i * n == j * m)
     arr[i][j] = 1; //точно на диагонали, таких элементов будет всего НОД(n,m) 
 else
     arr[i][j] = 0; //ниже диагонали

для 6×6:

1 2 2 2 2 2
0 1 2 2 2 2
0 0 1 2 2 2
0 0 0 1 2 2
0 0 0 0 1 2
0 0 0 0 0 1

для 6×9:

1 2 2 2 2 2
0 2 2 2 2 2
0 0 2 2 2 2
0 0 1 2 2 2
0 0 0 2 2 2
0 0 0 0 2 2
0 0 0 0 1 2
0 0 0 0 0 2
0 0 0 0 0 0

ответ дан 14 окт 2018 в 15:28

MBo's user avatar

MBoMBo

47.9k1 золотой знак17 серебряных знаков40 бронзовых знаков

следуя определению главной диагонали которая была дана в комментариях — следующий код напечатает все элементы стоящие выше главной диагонали (кроме самих элементов этой диагонали)

constexpr size_t n = 5, m = 4;
int mat[n][m] = 
{
    {1,  2,  3,  4},
    {5,  6,  7,  8},
    {9,  10, 11, 12},
    {10, 11, 12, 13},
    {14, 15, 16, 17}
};

for (size_t i = 0; i < n; i++)
{
    for (size_t j = i + 1; j < m; j++)
    {
        cout << mat[i][j] << ' ';
    }

    cout << 'n';
}

ответ дан 1 мая 2017 в 18:52

ampawd's user avatar

ampawdampawd

3,6841 золотой знак14 серебряных знаков30 бронзовых знаков

1

0 / 0 / 0

Регистрация: 20.06.2012

Сообщений: 8

1

Вычислить сумму элементов выше главной диагонали матрицы

31.07.2012, 14:39. Показов 25327. Ответов 6


Студворк — интернет-сервис помощи студентам

ввести двумерный массив b [4,4]. вычислить сумму элементов лежать выше главной диагонали матрицы и отобразить на экране.
p. s
помогите пожалуйста



0



DaskOFF

113 / 113 / 42

Регистрация: 02.05.2012

Сообщений: 524

Записей в блоге: 1

31.07.2012, 14:59

2

И капсом больше не пишите

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
#include <iostream>
 
int main()
{
    int mass[4][4];
 
    //Заполняем массив
    for (int i=0; i!=4;i++)
        for (int t=0;t !=4; t++) {
            system("cls");
            std::cout << "Enter mas[" <<i<<"]["<<t<<"] = ";
            std::cin >> mass[i][t];
        }
 
    int sum(0);
    for (int i=0; i !=4;i++)
        for (int j = i+1;j!=4;j++)
            sum+=mass[i][j];
 
    std::cout << "summ = " << sum << std::endl;
    system("pause");
 
    return 0;
}

Добавлено через 7 минут
вот с функцией

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
#include <iostream>
 
void summ(int (&mas)[4][4]) 
{
    int sum(0);
    for (int i=0; i!= 4; i++)
        for (int j=i+1;j!=4;j++)
            sum+=mas[i][j];
    std::cout << "summ = " << sum << std::endl;
}
 
int main()
{
    int mass[4][4];
 
    //Заполняем массив
    for (int i=0; i!=4;i++)
        for (int t=0;t !=4; t++) {
            system("cls");
            std::cout << "Enter mas[" <<i<<"]["<<t<<"] = ";
            std::cin >> mass[i][t];
        }
 
    summ(mass);
    system("pause");
 
    return 0;
}



1



Dr.Urban

63 / 58 / 14

Регистрация: 14.12.2011

Сообщений: 193

31.07.2012, 15:09

3

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if (i < j) 
{
       // выше диагонали
}
 
if (i > j)
{
      // ниже диагонали
}
 
if (i == j)
{
      // главная диагональ
}
 
if (i + j == N) // N - размер
{
      // вторая диагональ
}



1



nameless

Эксперт С++

342 / 306 / 36

Регистрация: 16.06.2009

Сообщений: 486

31.07.2012, 15:10

4

Markys,

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
#include <iostream>
#include <algorithm>
#include <random>
 
#include <boost/multi_array.hpp>
 
const int N = 4;   
 
int main() {
   typedef boost::multi_array <int, 2> matrix_t;
   typedef boost::multi_array_types::index_range range;
   typedef matrix_t::array_view <1>::type matrix_view;
   typedef boost::multi_array_ref <int, 1> array_ref;
   
   std::mt19937 rng;
   std::uniform_int_distribution <int> int_dist(0, 50);
   
   matrix_t matrix(boost::extents[N][N]);
   array_ref matrix_ref(
      matrix.data(),
      boost::extents[matrix.num_elements()]
   );
 
   std::generate(
      matrix_ref.begin(),
      matrix_ref.end(),
      [&int_dist, &rng]() -> int {
            return int_dist(rng);
      }
   );
   
   int sum = 0;
   for (std::size_t index = 0; index < N - 1; index++) {
      matrix_view row_view = matrix[
                                boost::indices[index]
                                [range(index + 1, N)]
                             ];  
      sum = std::accumulate(
               row_view.begin(),
               row_view.end(),
               sum
            );
   }
   std::cout << sum << "n";  
   for (std::size_t i = 0; i != matrix.size(); ++i) {
      std::copy(
         matrix[i].begin(),
         matrix[i].end(),
         std::ostream_iterator <int>(std::cout, "t")
      );
      std::cout << 'n';
   }
}

http://liveworkspace.org/code/… b39e8af6c5



2



Dr.Urban

63 / 58 / 14

Регистрация: 14.12.2011

Сообщений: 193

31.07.2012, 15:14

5

Цитата
Сообщение от nameless
Посмотреть сообщение

Markys,

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
#include <iostream>
#include <algorithm>
#include <random>
 
#include <boost/multi_array.hpp>
 
const int N = 4;   
 
int main() {
   typedef boost::multi_array <int, 2> matrix_t;
   typedef boost::multi_array_types::index_range range;
   typedef matrix_t::array_view <1>::type matrix_view;
   typedef boost::multi_array_ref <int, 1> array_ref;
   
   std::mt19937 rng;
   std::uniform_int_distribution <int> int_dist(0, 50);
   
   matrix_t matrix(boost::extents[N][N]);
   array_ref matrix_ref(
      matrix.data(),
      boost::extents[matrix.num_elements()]
   );
 
   std::generate(
      matrix_ref.begin(),
      matrix_ref.end(),
      [&int_dist, &rng]() -> int {
            return int_dist(rng);
      }
   );
   
   int sum = 0;
   for (std::size_t index = 0; index < N - 1; index++) {
      matrix_view row_view = matrix[
                                boost::indices[index]
                                [range(index + 1, N)]
                             ];  
      sum = std::accumulate(
               row_view.begin(),
               row_view.end(),
               sum
            );
   }
   std::cout << sum << "n";  
   for (std::size_t i = 0; i != matrix.size(); ++i) {
      std::copy(
         matrix[i].begin(),
         matrix[i].end(),
         std::ostream_iterator <int>(std::cout, "t")
      );
      std::cout << 'n';
   }
}

http://liveworkspace.org/code/… b39e8af6c5

Паскаль мне в резюме, зачем все это?



1



Эксперт С++

342 / 306 / 36

Регистрация: 16.06.2009

Сообщений: 486

31.07.2012, 15:18

7

Цитата
Сообщение от Dr.Urban
Посмотреть сообщение

Паскаль мне в резюме, зачем все это?

Экспериментирую с boost::multi_array, ничего более..)



0



program mas;
uses crt;
var A: array [1..100,1..100] of integer;
    i,j,k,n,m:integer;
 
begin
    clrscr;
    write('vvedite  n = ');
    readln(n);
    write('vvedite  m = ');
    readln(m);
    writeln('Введите элементы массива: ');
     for i := 1 to n do
         for j := 1 to m do
         begin
         Write('mas[', i, ']');
            Write('[', j, ']');
             readln(A[i,j]);
         end;
    writeln('matrica');
    for i:=1 to n do begin
    for j:=1  to m do
    write(' ',A[i,j],' ');
    writeln;
     end;
 
     for i := 1 to n do
         begin
           for j := 1 to m do
             begin
              if(i<j) then
              k:=k+1;
             end;
         end;
  writeln('количество элементов выше главной диагонали = ',k);
     readln;
end.

Here is an example case demonstrating how to find the sum in both cases, using nested loop:

matrix = [[i+j for j in range(4)] for i in range(4)]

for row in matrix:
    print(" ".join(list(map(str,row))))

totalSum = 0
for i in range(1,len(matrix)):
    for j in range(i):
        totalSum += matrix[i][j]
print("Below sum: ", totalSum)

totalSum = 0
for i in range(len(matrix)):
    for j in range(i+1,len(matrix)):
        totalSum += matrix[i][j]
print("Above sum: ", totalSum)

Output:

0 1 2 3
1 2 3 4
2 3 4 5
3 4 5 6
Below sum:  18
Above sum:  18

You can also use these one-liners:

Below diagonal:

totalSum = sum([matrix[i][j] for i in range(1,len(matrix)) for j in range(i)])

Above diagonal:

totalSum = sum([matrix[i][j] for i in range(len(matrix)) for j in range(i+1,len(matrix))])

If you want to sum all numbers above and below the main diagonal you can perform an index check:

totalSum = 0
for i in range(len(matrix)):
    for j in range(len(matrix)):
        if not i==j:
            totalSum += matrix[i][j]
print("Sum: ", totalSum)

Yet, another way of finding that sum (although not recommended) is to find the total sum of the matrix and the sum of the main diagonal and then perform a subtraction to find the final sum:

matrix = [[i+j for j in range(4)] for i in range(4)]

for row in matrix:
    print(" ".join(list(map(str,row))))

matrixSum = sum([sum(elem for elem in row) for row in matrix])
diagonalSum = sum([matrix[i][i] for i in range(len(matrix))])
finalSum = matrixSum - diagonalSum

print("Matrix sum: ", matrixSum)
print("Diagonal sum: ", diagonalSum)
print("Final sum: ", finalSum)

Output:

0 1 2 3
1 2 3 4
2 3 4 5
3 4 5 6

Matrix sum:  48
Diagonal sum:  12
Final sum:  36

Note: Mind the syntax in the print statements as you’re using Python 2 and my answer is in Python 3.

Понравилась статья? Поделить с друзьями:
  • Как найти линейное напряжение в звезде
  • Один глаз меньше другого причины у взрослых как исправить отзывы
  • Как по номеру карты москвенок найти владельца
  • Как найти массовую долю нитрата серебра
  • Скучно одной как найти друзей