Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 2
Регистрация: 02.03.2016
Сообщений: 7
1

Математические операции над матрицами

16.06.2018, 14:36. Показов 584. Ответов 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
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
112
113
114
115
#include <stdlib.h> 
#include <stdio.h> 
 
void naChislo(float** arr, int numb, float** result, unsigned int N); 
void pamyat(float*** arr, unsigned int N);
void ochistka(float** arr, unsigned int N); 
void vvod(char S, float** arr, unsigned int N); 
void stepen(float** &arr, int K, float** &result, unsigned int N); 
void minus(float** arr, float** arr1, float** result, unsigned int N); 
void vivod(char S, float** arr, unsigned int N); 
int main() 
{ 
    float **A, **B, **C, **BB, **AA; 
    unsigned int i, j, k, N; 
    printf("Vvedite razmernost - "); 
    scanf("%u", &N); 
    
    pamyat(&A, N); 
    pamyat(&B,N); 
    pamyat(&C,N); 
    pamyat(&BB,N); 
    pamyat(&AA,N); 
        
    vvod('A',A,N); 
    vvod('B',B,N); 
    
    vivod('A', A, N); 
    vivod('B', B, N); 
    
    minus(A, B, BB, N); 
    stepen(BB, 2, B, N); 
    naChislo(B, 2, BB, N); 
    stepen(A, 3, AA, N);     
    naChislo(AA, 3, A, N); 
    minus(A, BB, C, N); 
    
    vivod('C', C, N); 
    
    ochistka(A,N); 
    ochistka(B,N); 
    ochistka(C,N); 
    ochistka(BB,N); 
    ochistka(AA,N); 
    return 0; 
} 
 
void naChislo(float** arr, int numb, float** result, unsigned int N) 
{ 
    int i, j; 
    for(i=0;i<N;i++) 
    for(j=0;j<N;j++) 
    *(*(result+i)+j)=numb* *(*(arr+i)+j); 
} 
 
void pamyat(float*** arr,unsigned int N) 
{ 
    int i; 
    *arr = new float*[N]; 
    for(i=0; i<N; i++) 
    *(*arr+i) = new float [N]; 
} 
 
void ochistka(float** arr,unsigned int N) 
{ 
    for (int i=0; i<N; i++) 
    delete [] *(arr+i); 
    delete [] arr; 
} 
 
void vvod(char S, float** arr, unsigned int N) 
{ 
    unsigned int i, j; 
    printf("\n\t\t\tVvedite Massiv %c\n", S); 
    for(i=0;i<N;i++) 
    for(j=0;j<N;j++) 
    { 
        printf("\nVvedi element %c[%d][%d] - ",S, i+1, j+1); 
        scanf("%f", *(arr+i)+j ); 
    } 
} 
 
void stepen(float** &arr, int K, float** &result, unsigned int N) 
{ 
    unsigned int i,j,r; 
    float sum; 
    for(i=0;i<K;i++) 
    for(j=0;j<K;j++) 
    { 
        sum=0; 
        for(r=0;r<K;r++) 
        sum+=*(*(arr+i)+r)* *(*(arr+r)+j);      
        *(*(result+i)+j)=sum; 
    } 
} 
 
void minus(float** arr, float** arr1, float** result, unsigned int N) 
{ 
    unsigned int i,j; 
    float razn; 
    for(i=0;i<N;i++) 
    for(j=0;j<N;j++) 
    *(*(result+i)+j)=*(*(arr+i)+j) - *(*(arr1+i)+j); 
}
 
void vivod(char S, float** arr, unsigned int N) 
{ 
    unsigned int i,j; 
    printf("\n MATRICA %C \n", S); 
    for(i=0;i<N;i++) 
    { 
        for(j=0;j<N;j++) 
        printf("%7.2f ", *(*(arr+i)+j)); 
        printf("\n"); 
    } 
}
0
Миниатюры
Математические операции над матрицами  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.06.2018, 14:36
Ответы с готовыми решениями:

Математические операции с типами данных
Здравствуйте, хотел бы получить немного помощи. Определены два 32х битных числа: uint32_t NUM1...

Выполнить арифметические действия над матрицами
Выполнить действия над матрицами Буду очень благодарен.

Параллельное программирование, действия над векторами и матрицами
Здравствуйте, кто может помочь с кодом? Язык С. (С параллельным программированием) . Задание:...

Операции над числами
Здрасьте.Скажите пожалуйста.Есть программа, которая с помощью функции &lt;Rand&gt; в цикле-While, выводит...

__________________
2
0 / 0 / 2
Регистрация: 02.03.2016
Сообщений: 7
16.06.2018, 21:41  [ТС] 2
Я думаю так выразить подпрограмму, но выдаёт C:\<путь к файлу>\collect2.exe [Error] ld returned 1 exit status
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
float stepen(float** arr, int K, float** result, unsigned int N) 
{ 
    unsigned int p,x,i,j,r; 
    float step,**AB,**AC; 
    AB = new float*[N]; 
    AC = new float*[N]; 
    for(i=0; i<N; i++) 
    {
        *(AB+i) = new float [N]; 
        *(AC+i) = new float [N]; 
    }   
    for(x=0;x<K;x++)
    {
 
        for(i=0;i<N;i++) 
        {
            for(j=0;j<N;j++) 
            {
                for(r=0;r<N;r++) 
                if(x%2)
                *(*(AB+i)+r)+=*(*(arr+i)+r)* *(*(AC+r)+j);
                else
                *(*(AC+i)+r)+=*(*(arr+i)+r)* *(*(AB+r)+j);
            }
        }
    }    
    for(i=0;i<N;i++) 
    {
        for(j=0;j<N;j++)
        if(x%2)
        *(*(result+i)+j)=*(*(AC+i)+j);
        else
        *(*(result+i)+j)=*(*(AB+i)+j);
    }
}
0
0 / 0 / 2
Регистрация: 02.03.2016
Сообщений: 7
18.06.2018, 17:41  [ТС] 3
В общем, если кому будет интересно - полностью правильный и рабочий код выглядит так :
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#include <iostream>
#include <stdlib.h> 
#include <stdio.h> 
#include <math.h>
#include <conio.h>
#include <windows.h>
 
void naChislo(float** arr, int numb, float** result, unsigned int N); 
float **pamyat(unsigned int N);
void ochistka(float** arr, unsigned int N); 
void vvod(char S, float** arr, unsigned int N); 
void stepen(float** arr, unsigned int K, float** result, unsigned int N); 
void minus(float** arr, float** arr1, float** result, unsigned int N); 
void vivod(char S, float** arr, unsigned int N); 
int main() 
{ 
    float **A, **B, **C, **BB, **AA; 
    unsigned int i, j, k, N; 
    printf("Vvedite razmernost - "); 
    scanf("%u", &N); 
    
    A=pamyat(N);
    B=pamyat(N);
    C=pamyat(N);
    BB=pamyat(N);
    AA=pamyat(N);
    
    vvod('A',A,N); 
    vvod('B',B,N); 
    
    vivod('A', A, N); 
    vivod('B', B, N); 
    
    minus(A, B, BB, N); 
    stepen(BB, 2, B, N);
    naChislo(B, 2, BB, N);
    stepen(A, 3, AA, N); 
    naChislo(AA, 3, A, N); 
    minus(A, BB, C, N); 
    
    vivod('C', C, N); 
    
    ochistka(A,N); 
    ochistka(B,N); 
    ochistka(C,N); 
    ochistka(BB,N); 
    ochistka(AA,N); 
    return 0; 
} 
 
void naChislo(float** arr, int numb, float** result, unsigned int N) 
{ 
    int i, j; 
    for(i=0;i<N;i++) 
    for(j=0;j<N;j++) 
    *(*(result+i)+j)=numb* *(*(arr+i)+j); 
} 
 
float **pamyat(unsigned int N) 
{ 
    float **arr;
    unsigned int i; 
    arr = new float*[N]; 
    for(i=0; i<N; i++) 
    *(arr+i) = new float [N];
    return arr; 
} 
 
void ochistka(float** arr,unsigned int N) 
{ 
    for (int i=0; i<N; i++) 
    delete [] *(arr+i); 
    delete [] arr; 
} 
 
void vvod(char S, float** arr, unsigned int N) 
{ 
    unsigned int i, j; 
    printf("\n\t\t\tVvedite Massiv %c\n", S); 
    for(i=0;i<N;i++) 
    for(j=0;j<N;j++) 
    { 
        printf("\nVvedi element %c[%d][%d] - ",S, i+1, j+1); 
        scanf("%f", *(arr+i)+j ); 
    } 
} 
 
void stepen(float** arr, unsigned int K, float** result, unsigned int N) 
{ 
    unsigned int p,x,i,j,r; 
    float **AB,**AC; 
    AB = new float*[N]; 
    AC = new float*[N];     
    for(i=0; i<N; i++) 
    {
        *(AB+i) = new float [N]; 
        *(AC+i) = new float [N];        
    }   
    for(i = 0; i < N; i++)
    {
        for(j = 0; j < N; j++)      
        {
        *(*(result+i)+j) = 0;  
        *(*(AB+i)+j) = *(*(arr+i)+j);          
    }  
    } 
    for(x = 1; x < K; x++)
    {        
        for(i = 0; i < N; i++)
    {
            for(j = 0; j < N; j++)
        {
                *(*(AC+i)+j) = 0;
                for(r = 0; r < N; r++)
        *(*(AC+i)+j) += *(*(arr+i)+r)* *(*(AB+r)+j);                
            }
        }
        for(i = 0; i < N; i++)
    {
            for(j = 0; j < N; j++)
            *(*(AB+i)+j) = *(*(AC+i)+j); 
        }
    }
    for(i = 0; i < N; i++) 
    {
        for(j = 0; j < N; j++)      
        {
            *(*(result+i)+j) = *(*(AC+i)+j);
        }
    }
    for (i=0; i<N; i++)
    {
        delete [] *(AC+i);
        delete [] *(AB+i);
    }
    delete [] AB;
    delete [] AC;
}
 
void minus(float** arr, float** arr1, float** result, unsigned int N) 
{ 
    unsigned int i,j; 
    float razn; 
    for(i=0;i<N;i++) 
    for(j=0;j<N;j++) 
    *(*(result+i)+j)=*(*(arr+i)+j) - *(*(arr1+i)+j); 
}
 
void vivod(char S, float** arr, unsigned int N) 
{ 
    unsigned int i,j; 
    printf("\n MATRICA %C \n", S); 
    for(i=0;i<N;i++) 
    { 
        for(j=0;j<N;j++) 
        printf("%7.2f ", *(*(arr+i)+j)); 
        printf("\n"); 
    } 
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.06.2018, 17:41

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Операции над комплексными числами
Здравствуйте. У меня возникла ошибка во время написания операции разности для множеств. Операция...

Арифметические операции над числами
Доброго вечера.Помогите-помогите,завтра нужно сдать,иначе не видать зачета( нужно написать...

Арифметические операции над числами
Пользователь вводит с клавиатуры два целочисленных значения: X и Y. Рассчитать сумму X+Y и...

Логические и квантовые операции над предикатами
как можно реализовать &quot;логические и квантовые операции над предикатами&quot; на си/си++?


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.