Форум программистов, компьютерный форум CyberForum.ru

Сумма по строкам в матрице и индексы - C++

Восстановить пароль Регистрация
 
apachan
13 / 13 / 2
Регистрация: 07.12.2010
Сообщений: 127
21.04.2012, 20:12     Сумма по строкам в матрице и индексы #1
Есть программа, решение слау, не суть важно, нужно выяснить, есть ли в матрице А диагональное преобладание (а если нет - то вывести номер строки, где оно нарушается), т.е. модуль элементов на гл. диагонали меньше суммы модулей остальных элементов в строке, пример:

2 1 0 0
1 4 -0.5 0
0 1 -5 2
0 0 1 4

Элементы на диагонали: 2>1+0+0; 4>1+0.5+0; |-5|>2+1+0 4>0+0+1, есть
если б вместо 1 в первой строке было 100, не было бы, соотв.

Как-то так Вот что есть:


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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <iostream.h>
#include <math.h>
void main (void)
{
int N,i,j,k;
cout <<"Enter N: "; // Ввод номера варианта
cin >>N;
double A[4][4]={{2,1,0,0},{1,2*N,-0.5,0},{0,1,-5,2},{0,0,1,4}},
// Матрица А, приведённая к трехдиагональному виду
R[4][1]={{0.2*N+1},{2*N},{-N+5},{0.2*N+8}},
X[4][1]={{0},{0},{0},{0}},
B[4][1]={{0},{0},{0},{0}}, // Элементы ниже главной диагонали
C[4][1]={{0},{0},{0},{0}}, // Элементы из главной диагонали
D[4][1]={{0},{0},{0},{0}}, //Элементы выше главной диагонали
delta[4][1]={{0},{0},{0},{0}},
lambda[4][1]={{0},{0},{0},{0}};
cout <<endl<<"Matrix A"<<endl; // Вывод матрицы А
for (i=0; i<4; i++)
{
for (j=0; j<4; j++)
{
cout<<A[i][j]<<" ";
}
cout <<endl;
}
cout <<endl;
cout <<"Matrix R"<<endl; // Вывод матрицы R
for (i=0; i<4; i++)
{
cout<<R[i][0];
cout<<endl;
}
cout <<endl;
for (i=0; i<4; i++)
{
C[i][0]=A[i][i]; // Заполнение С элементами из главной диагонали матрицы А
}
cout <<"Matrix C"<<endl; // Вывод вектора С
for (i=0; i<4; i++)
{
cout<<C[i][0];
cout<<endl;
}
cout <<endl;
for (i=0; i<3; i++)
{
B[i+1][0]=A[i+1][i];
// Заполнение вектора В элементами, стоящими ниже главной диагонали матрицы А
}
cout <<"Matrix B"<<endl; // Вывод вектора В
for (i=0; i<4; i++)
{
cout<<B[i][0];
cout<<endl;
}
cout <<endl;
for (i=0; i<3; i++)
{
D[i][0]=A[i][i+1];
// Заполнение вектора D элементами, стоящими выше главной диагонали матрицы А
}
cout <<"Matrix D"<<endl; // Вывод вектора D
for (i=0; i<4; i++)
{
cout<<D[i][0];
cout<<endl;
}
cout <<endl;
delta[0][0]=-D[0][0]/C[0][0];
// Первый элемент ?1 равен отрицательному отношению первых элементов векторов D и С
lambda[0][0]=R[0][0]/C[0][0];
// Первый элемент ?1 равен отрицательному отношению первых элементов векторов R и С
// Вычисление коэффициентов ?i и ?i :
for (i=1; i<4; i++)
{
delta[i][0]=-D[i][0]/(C[i][0]+B[i][0]*delta[i-1][0]);
lambda[i][0]=(R[i][0]-B[i][0]*lambda[i-1][0])/(C[i][0]+B[i][0]*delta[i-1][0]);
}
cout <<"Matrix delta"<<endl; // Вывод матрицы ?
for (i=0; i<4; i++)
{
cout<<delta[i][0];
cout<<endl;
}
cout <<endl;
cout <<"Matrix lambda"<<endl; // Вывод матрицы ?
for (i=0; i<4; i++)
{
cout<<lambda[i][0];
cout<<endl;
}
cout <<endl;
X[3][0]=lambda[3][0]; // Старшему элементу Х присваиваем третье значение ?
for (i=2; i>-1; i--)
{
X[i][0]=delta[i][0]*X[i+1][0]+lambda[i][0]; // x(i) = ?(i)*x(i+1) + ?(i)
}
cout <<"Matrix X"<<endl; // Вывод Х (решения)
for (i=0; i<4; i++)
{
cout<<X[i][0];
cout<<endl;
}
cout <<endl;
if ((fabs(A[0][0])>fabs(A[0][1]+A[0][2]+A[0][3])) && (fabs(A[1][1])>fabs(A[1][0]+A[1][2]+A[1][3])) && (fabs(A[2][2])>fabs(A[2][0]+A[2][1]+A[2][3])) && (fabs(A[3][3])>fabs(A[3][0]+A[3][2]+A[3][1])))
    cout<<"Da"<<endl;
else
 
cout<<"Net"<<endl;
 
}
Вопросы: как вывести номер строки, где нарушение и может как-то можно обойтись без кучи условий (для больших матриц, 10х10)?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.04.2012, 20:12     Сумма по строкам в матрице и индексы
Посмотрите здесь:

C++ В целочисленной матрице указать индексы всех элементов, имеющих наибольшее значение в столбцах
Элементы одномерного массива A (n^2) разместить в матрице B (n, n) по строкам C++
В матрице найти максимум среди минимумов по строкам C++
В данной квадратной матрице порядка 17 указать индексы всех элементов с наименьшим значением C++
Сумма элементов по строкам в двумерном массиве... C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
21.04.2012, 20:28     Сумма по строкам в матрице и индексы #2
Если квадратная матрица A[][] имеет размерность n*n, то можно так:
C++
1
2
3
4
5
6
7
8
9
10
int i, j, sum;
for(i=0; i<n; i++)
{
    sum=0;
    for(j=0; j<n; j++)
        if(i!=j)
            sum+=fabs(A[i][j]);
    if(sum>fabs(A[i][i]))
        cout<<i<<endl;
}
apachan
13 / 13 / 2
Регистрация: 07.12.2010
Сообщений: 127
21.04.2012, 21:04  [ТС]     Сумма по строкам в матрице и индексы #3
Если квадратная матрица A[][] имеет размерность n*n, то можно так:
Диагональное преобладание есть только в квадратных матрицах

Выводит правильно, но:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int  sum, n=4;
for(i=0; i<n; i++)
{
    sum=0;
    for(j=0; j<n; j++)
        if(i!=j)
            sum+=fabs(A[i][j]);
    if(sum>fabs(A[i][i]))
        
    
        cout<<"Net DP, v str #"<<i+1<<endl;
    else cout<<"Est DP"<<endl;
    
}
 
}
Выводится 4 раза, если "есть ДП", а если нет, выводится правильно "номер строки и нет ДП", но "есть ДП" тоже выводится, как быть?
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
21.04.2012, 22:34     Сумма по строкам в матрице и индексы #4
Цитата Сообщение от apachan Посмотреть сообщение
Выводится 4 раза, если "есть ДП", а если нет, выводится правильно "номер строки и нет ДП", но "есть ДП" тоже выводится, как быть?
можно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int  sum, n=4;
bool fl=true;
for(i=0; i<n; i++)
{
    sum=0;
    for(j=0; j<n; j++)
        if(i!=j)
            sum+=fabs(A[i][j]);
    if(sum>fabs(A[i][i]))
    {    
        cout<<"Net DP, v str #"<<i+1<<endl;
        fl=false;
    }    
} 
}
if(fl) cout<<"Est DP"<<endl;
apachan
13 / 13 / 2
Регистрация: 07.12.2010
Сообщений: 127
22.04.2012, 14:58  [ТС]     Сумма по строкам в матрице и индексы #5
Спасибо большое, теперь все как надо

В строке 9:

warning C4244: '+=' : conversion from 'double' to 'int', possible loss of data но видимо это не играет роли...
Yandex
Объявления
22.04.2012, 14:58     Сумма по строкам в матрице и индексы
Ответ Создать тему
Опции темы

Текущее время: 08:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru