闲来无事,最近刚刚开始学习线性代数,想着用C实现一些基础的线性代数的操作,便于平时学习,也作为对C的练习。
#include <stdio.h>
#include <memory.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
void zhuanzhi(int **, int, int);
void print(int **, int, int);
void cpy(int**, int **, int, int);
void tdmemset(int **, int, int);
int main()
{
int **a = NULL,i,j,oper;
int X, Y;
printf("Input X length and Y length:\n");
scanf("%d%d", &Y, &X);
a = (int **)malloc(Y * sizeof(int*));
for (i = 0; i < Y; i++)
a[i] = (int *)malloc(X * sizeof(int));
printf("Input:\n");
for (i = 0; i < Y; i++)
for (j = 0; j < X; j++)
scanf("%d", &a[i][j]);
print(a, X, Y);
printf("Expected operation?:\n1:转置\n");
scanf("%d", &oper);
switch (oper)
{
case 1:zhuanzhi(a, X, Y);break;
}
/*释放*/
for (i = 0; i < X; i++) free(a[i]);
free(a);
return 0;
}
void zhuanzhi(int **a, int Xlength, int Ylength)
{
int situation=-1;
int i,j;
if (Xlength == Ylength) situation = 0;
else if (Xlength < Ylength) situation = 1;
else if (Xlength > Ylength) situation = 2;
if (situation == 0)
{
int **b;
b = (int **)malloc(Ylength * sizeof(int*));
for (i = 0; i < Ylength; i++)
b[i] = (int *)malloc(Xlength * sizeof(int));
cpy(a, b, Xlength, Ylength);
for (i = 0; i < Ylength; i++)
{
for (j = 0; j < Xlength; j++)
a[i][j]=b[j][i];
}
print(a, Xlength, Ylength);
for (i = 0; i < Xlength; i++) free(b[i]);
free(b);
}
else if (situation == 1)
{
int **c;
c = (int **)malloc(Ylength * sizeof(int*));
for (i = 0; i < Ylength; i++)
c[i] = (int *)malloc(Ylength * sizeof(int));
tdmemset(c, Ylength, Ylength);
cpy(a, c, Xlength, Ylength);
int **b;
b = (int **)malloc(Ylength * sizeof(int*));
for (i = 0; i < Ylength; i++)
b[i] = (int *)malloc(Ylength * sizeof(int));
cpy(c, b, Ylength, Ylength);
for (i = 0; i < Ylength; i++)
{
for (j = 0; j < Ylength; j++)
c[i][j]=b[j][i];
}
print(c, Ylength, Xlength);
for (i = 0; i < Xlength; i++) free(b[i]);
free(b);
for (i = 0; i < Xlength; i++) free(c[i]);
free(c);
}
else if (situation == 2)
{
int **c;
c = (int **)malloc(Xlength * sizeof(int*));
for (i = 0; i < Xlength; i++)
c[i] = (int *)malloc(Xlength * sizeof(int));
tdmemset(c, Xlength, Xlength);
cpy(a, c, Xlength, Ylength);
int **b;
b = (int **)malloc(Xlength * sizeof(int*));
for (i = 0; i < Xlength; i++)
b[i] = (int *)malloc(Xlength * sizeof(int));
cpy(c, b, Xlength, Xlength);
for (i = 0; i < Xlength; i++)
{
for (j = 0; j < Xlength; j++)
c[i][j]=b[j][i];
}
print(c, Ylength, Xlength);
for (i = 0; i < Xlength; i++) free(b[i]);
free(b);
for (i = 0; i < Xlength; i++) free(c[i]);
free(c);
}
}
void print(int **a, int Xlength, int Ylength)
{
int j = 0, i;
for (i = 0; i < Ylength; i++)
{
for (j = 0; j < Xlength; j++)
printf("%-4d", a[i][j]);
printf("\n");
}
}
void cpy(int **a, int **b, int x, int y)
{
int i,j;
for (i = 0; i < y; i++)
for (j = 0; j < x; j++)
b[i][j] = a[i][j];
}
void tdmemset(int **a, int x, int y)
{
int i,j;
for (i = 0; i < x; i++)
for (j = 0; j < y; j++)
a[i][j] = 0;
}
十分繁琐
十分冗长
之后还会继续修改优化以及增加新功能