• 稀疏矩阵运算器


    对稀疏矩阵进行加减乘简单运算,矩阵元素初定为整型,需要的话可以更改为实型,矩阵大小初定为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
  • 相关阅读:
    java—连连看-实现封装
    java—连连看GUI
    连连看--产生随机数
    勇者斗恶龙
    在ctex环境下利用Metapost作图
    [leetcode] Binary Tree Postorder Traversal
    [leetcode] Binary Tree Maximum Path Sum
    [leetcode] Binary Tree Level Order Traversal II
    [leetcode] Binary Tree Level Order Traversal
    [leetcode] Binary Tree Inorder Traversal
  • 原文地址:https://www.cnblogs.com/kanone/p/1877042.html
Copyright © 2020-2023  润新知