对稀疏矩阵进行加减乘简单运算,矩阵元素初定为整型,需要的话可以更改为实型,矩阵大小初定为20×20,可更改相应代码进行扩大。
仓促写的。。= =,没有优化可能比较臃肿。。,输入的时候得按照行列顺序输入,懒得编对输入进行
处理的函数了。。。= =||
使用方法见图例:
加法:
减法:
乘法:
代码
1 // 20*20以内的矩阵运算
2
3
4 #include <stdio.h>
5 #include <conio.h>
6
7 #define MAXSIZE 500
8 #define MAXRC 30 //更改为更大的数以支持更大的矩阵运算
9
10 typedef struct
11 {
12 int i, j;
13 int e;
14 }Triple;
15
16 typedef struct
17 {
18 Triple data[MAXSIZE + 1];
19 int mu, nu, tu;
20 }TSMatrix;
21
22
23 int Abstract(TSMatrix A, int i, int j) //提取A矩阵中第i行第j列的元素
24 {
25 int k;
26 for (k = 1; k < A.tu + 1; k++)
27 {
28 if (A.data[k].i == i && A.data[k].j == j)
29 return A.data[k].e;
30 }
31 return 0;
32 }
33
34 void Prin(TSMatrix T) //矩阵的输出函数
35 {
36 int Array[50][50] = {0};
37 int i, j;
38 for (i = 1; i < T.tu + 1; i++)
39 {
40 Array[T.data[i].i][T.data[i].j] = T.data[i].e;
41 }
42 for (i = 1; i < T.mu + 1; i++)
43 {
44 for (j = 1; j < T.nu + 1; j++)
45 {
46 printf("%4d ", Array[i][j]);
47 if (j == T.nu)
48 printf("\n");
49 }
50 }
51 }
52
53 TSMatrix Add(TSMatrix A, TSMatrix B) //矩阵相加函数
54 {
55 int i, j, k, temp;
56 i = j = k = 1;
57 TSMatrix C;
58 C.mu = A.mu;
59 C.nu = A.nu;
60
61 //方法一:
62
63
64 /* 只对非零元进行运算,免去了一个一个提取矩阵元素的过程
65 while (i < A.tu + 1 || j < B.tu + 1)
66 {
67 if (i > A.tu && j <= B.tu) //A中的非零元素处理完毕,B没有时,将B剩余非零元直接复制入C
68 {
69 C.data[k] = B.data[j];
70 j++;
71 k++;
72 }
73 else
74 {
75 if (i <= A.tu && j > B.tu) //B中的非零元素处理完毕,A没有时,将A剩余非零元直接复制入C
76 {
77 C.data[k] = A.data[j];
78 i++;
79 k++;
80 }
81 else
82 {
83
84 if (A.data[i].i < B.data[j].i) //A中非零元素行优先
85 {
86 C.data[k] = A.data[j];
87 i++;
88 k++;
89 }
90 else
91 {
92 if (A.data[i].i > B.data[j].i) //B中非零元素行优先
93 {
94 C.data[k] = B.data[j];
95 j++;
96 k++;
97 }
98 else
99 {
100 if (A.data[i].j < B.data[j].j) //A中非零元素列优先
101 {
102 C.data[k] = A.data[i];
103 i++;
104 k++;
105 }
106 else
107 {
108 if (A.data[i].i > B.data[j].i) //B中非零元素列优先
109 {
110 C.data[k] = B.data[j];
111 j++;
112 k++;
113 }
114 else //A,B矩阵非零元素处于同一位置时相加,并且和为0时作出相应处理
115 {
116 C.data[k].e = A.data[i].e + B.data[j].e;
117 C.data[k].i = A.data[i].i;
118 C.data[k].j = A.data[i].j;
119 if (C.data[k].e == 0)
120 k--;
121 i++;
122 j++;
123 k++;
124 }
125 }
126 }
127
128 }
129 }
130 }
131 }
132 C.tu = k - 1;
133 return C;
134 */
135
136 //方法二:
137
138 for (i = 1; i < C.mu + 1; i++)
139 {
140 for (j = 1; j < C.nu + 1; j++)
141 {
142 temp = Abstract(A, i, j) + Abstract(B, i, j); //依次对每个元素进行运算
143 if ( temp != 0)
144 {
145 C.data[k].e = temp;
146 C.data[k].i = i;
147 C.data[k].j = j;
148 k++;
149 }
150 }
151 }
152 C.tu = k - 1;
153 return C;
154 }
155
156 TSMatrix Substract(TSMatrix A, TSMatrix B) //减法函数,先将B矩阵元素取相反数,再与A相加即可
157 {
158 TSMatrix C;
159 int i;
160 for (i = 1; i < B.tu + 1; i++)
161 {
162 B.data[i].e = -1 * B.data[i].e;
163 }
164 C = Add(A, B);
165 return C;
166 }
167
168
169
170
171
172 int RowMultiCol(TSMatrix A, TSMatrix B, int i, int j) //行与列对应相乘
173 {
174 int m, sum;
175 sum = 0;
176 for (m = 1; m < A.nu + 1; m++)
177 {
178 sum = sum + Abstract(A, i, m) * Abstract(B, m, j);
179
180 }
181 return sum;
182 }
183 TSMatrix Multiply(TSMatrix A, TSMatrix B) //乘法的函数
184 {
185 int i, j, k, t, temp = 0;
186 i = j = k = 1;
187 TSMatrix C;
188 C.mu = A.mu;
189 C.nu = B.nu;
190 for (t = 1; t < MAXSIZE + 1; t++)
191 {
192 C.data[t].e = 0;
193 }
194 for (i = 1; i < C.mu + 1; i++)
195 {
196 for (j = 1; j < C.nu + 1; j++)
197 {
198 temp = RowMultiCol(A, B, i, j);
199 if ( temp != 0)
200 {
201 C.data[k].e = temp;
202 C.data[k].i = i;
203 C.data[k].j = j;
204 k++;
205 }
206 }
207 }
208 C.tu = k - 1;
209 return C;
210
211
212 }
213
214 void main()
215 {
216 char c;
217 int i;
218 TSMatrix A, B, C;
219 printf("Input the row(<=20),colmun(<=20) and t of Matrix A:\n");
220 scanf("%d %d %d", &A.mu, &A.nu, &A.tu);
221 printf("Input the element of Matrix A in order(first row then column):\n");
222 for (i = 1; i < A.tu + 1; i++)
223 {
224 scanf(" (%d,%d,%d)", &A.data[i].i, &A.data[i].j, &A.data[i].e);
225 }
226 printf("Input the row(<=20),colmun(<=20) and t of Matrix B:\n");
227 scanf("%d %d %d", &B.mu, &B.nu, &B.tu);
228 printf("Input the element of Matrix B in order(first row then column):\n");
229 for (i = 1; i < B.tu + 1; i++)
230 {
231 scanf(" (%d,%d,%d)", &B.data[i].i, &B.data[i].j, &B.data[i].e);
232 }
233 printf("Matrix A:\n");
234 Prin(A);
235 printf("\nMatrix B:\n");
236 Prin(B);
237 printf("Choose a operation:\n1) Add;\n2) Substract;\n3) Multiply\n");
238 scanf(" %c", &c);
239 if (c == '1') //对各种输入情况进行判断并处理矩阵
240 {
241 if (A.mu == B.mu && A.nu == B.nu)
242 {
243 C = Add(A, B);
244 printf("\nA + B:\n");
245 Prin(C);
246 }
247 else
248 printf("Error!\n");
249 }
250 else
251 {
252 if (c == '2')
253 {
254 if (A.mu == B.mu && A.nu == B.nu)
255 {
256 C = Substract(A, B);
257 printf("\nA - B:\n");
258 Prin(C);
259 }
260 else
261 printf("Error!\n");
262 }
263 else
264 {
265
266 if (c == '3')
267 {
268 if (A.nu == B.mu)
269 {
270 C = Multiply(A, B);
271 printf("\nA * B:\n");
272 Prin(C);
273 }
274 else
275 printf("Error!\n");
276 }
277 else
278 {
279 printf("Error!\n");
280 }
281 }
282 }
283 }
284