矩阵-c语言中两个数组相乘的问题

问题描述

c语言中两个数组相乘的问题

#include
#include
#define OK 1
#define ERROR 0
#define MAXSIZE 100 //最多非0元素的个数
#define MAXR 50 //rpos所能处理的最大行数
#define MAXC 50 //系数矩阵相乘时,保留临时列结果的数组temp[MAXC]
typedef struct NODE{ //定义稀疏矩阵结点

int i;

int j;

int data;
} Node;
typedef struct MATRIX{ //定义稀疏矩阵(可以快速访问)

int mu, nu, tu;

Node matrix[MAXSIZE+1];

int rpos[MAXR+1];
} Matrix;

int CreatSMatrix( Matrix* M ); //创建一个矩阵(由用户输入原始矩阵,转化为稀疏矩阵方式储存)
int Print( Matrix M ); //打印一个稀疏矩阵
int Mul_SMatrix( Matrix M, Matrix N, Matrix *Q); //两个稀疏矩阵相乘

main(){

Matrix A1, A2, A3; //定义矩阵

CreatSMatrix( &A1 );

CreatSMatrix( &A2 );

if( A1.nu==A2.mu ){ //判断能否相乘

Mul_SMatrix( A1, A2, &A3 );

printf("两矩阵相乘得:n"); Print(A3);

}
else printf("两矩阵不能相乘");

system("pause");

return 0;
}
//稀疏矩阵相乘
int Mul_SMatrix( Matrix M, Matrix N, Matrix *Q)
{
int i,Mj;
int arow, Mlim, Nlim, Mcol, Nrow;
int ctemp[MAXC];
Q->tu=0;
//初始化Q

Q->mu=M.mu; Q->nu=M.nu;
if(M.tu*N.tu!=0){
//非零矩阵
for(arow=1; arow<=M.mu; arow++){

for(i=1; i<=M.nu; i++)//清空累加器

ctemp[i]=0;

Q->rpos[arow]=Q->tu+1; //给Q->rpos[]数组赋值

Mlim = arow
//M中第arow行在结点数组中的范围
for( Mcol=M.rpos[arow]; Mcol
//遍历M中第arow行的每一个j
Mj=M.matrix[Mcol].j;
Nlim = Mj
for( Nrow=N.rpos[Mj]; Nrow
ctemp[N.matrix[Nrow].j] += M.matrix[Mcol].data * N.matrix[Nrow].data;
}
for(i=1; inu; i++){//列号对应元素不为零,赋值

if( ctemp[i] ){

if( ++Q->tu > MAXSIZE )

return 0;

Q->matrix[Q->tu].i = arow;

Q->matrix[Q->tu].j = i;

Q->matrix[Q->tu].data = ctemp[i];

}

}
}
}
return 1;
}

//构建稀疏矩阵
int CreatSMatrix( Matrix* M ){

int temp, i,j;

printf("输入矩阵的行列数:");

scanf("%d%d", &M->mu, &M->nu);

M->tu=0;

printf("按行序输入矩阵:n");

for( i=1; i<=M->mu; i++){

M->rpos[i]=M->tu+1; //每计算完一行,给rpos[]赋值

for( j=1; j<=M->nu; j++){

scanf("%d",&temp );

if( temp ){ //非0值保存

M->matrix[M->tu+1].i= i;

M->matrix[M->tu+1].j= j;

M->matrix[M->tu+1].data=temp;

M->tu++;

}

}

}

return OK;
}

//打印稀疏矩阵
int Print( Matrix M){
int i;
if(M.tu==0){
printf("空矩阵nn");
return ERROR;
}
printf("itjtdatan");
for( i=1; i<=M.tu; i++ )
printf("%dt%dt%dn", M.matrix[i].i,M.matrix[i].j,M.matrix[i].data);
return OK;

}

中int rpos[MAXR+1]这个是干啥用的啊?

解决方案

rpos[i]用于存储矩阵M的第i行的行号(第几行),并且这个下标是i+1;
由于数组是从0开始的,对于一个n行的矩阵,它的第1行存在数组里的下标是0;
这个程序就写成第一行下标就是1,第二行下标就是2,并且将这些下标存在一个数组里

时间: 2025-01-31 06:08:21

矩阵-c语言中两个数组相乘的问题的相关文章

c语言-C语言中多维数组如何赋值

问题描述 C语言中多维数组如何赋值 请问 多维数组如何赋值 int a[3][4][5]; 请问C语言的前辈们 数组a中的元素个数是不是60个呢? 我是这样算出来的 这个多维数组是 12一维数组的集合 这个1维数组的元素有5个 12x5=60 解决方案 C语言 指针数组 多维数组C语言 指针数组 多维数组C语言中多维数组的理解 解决方案二: 最后一个参数是在一行当中确定一个,第二参数是在很多行当中确定一行,第一个参数是在很多页当中确定一页,为了确定某个元素,你必须先确定它在哪一页上,每一页都是4

c语言-C语言中两个变量的值互换问题

问题描述 C语言中两个变量的值互换问题 两个变量的值互换为什么不能直接用 a=b;b=a;来实现. 解决方案 如gcwlwl7所说的 a=1 ,b=2 要变成a=2 b=1的话 用所列举的两个等式为 先a=b=2,此时a已经变成2了, 再b=a=2,b仍然等于2(a在上面已经变成2了.所以b=a即是b=2) 不过有种方法: a=1; b=2; a=a+b=3; (1+2) b=a-b=1; (3-2) a=a-b=2; (3-1) 即最后就得到 a=2;b=1啦 这个是不要用到中间变量的方法 希

c语言-C语言中怎么用数组接收多个字符串

问题描述 C语言中怎么用数组接收多个字符串 #include int main() { char *colour[5]; colour[0] = "red"; colour[1] = "yellow"; colour[2] = "green"; colour[3] = "blue"; colour[4] = "pink"; return 0; } //请问这种方法对不对? //如果想用键盘输入(scanf)

深入分析C++中两个大数相乘结果不正确的问题_C 语言

在编写代码做测试时发现两个大数相乘结果不正确的问题,测试代码如下: #include "stdafx.h"#include<stdlib.h>#include<time.h>int _tmain(int argc, _TCHAR* argv[]){      time_t temp1=1345172428000000;    time_t temp2=1345172428*1000000;   ::system("pause");    re

浅析Java语言中两种异常的差别

Java提供了两类主要的异常:runtime exception和checked exception.所有的checked exception是从java.lang.Exception类衍生出来的,而runtime exception则是从java.lang.RuntimeException或java.lang.Error类衍生出来的. 它们的不同之处表现在两方面:机制上和逻辑上. 一.机制上 它们在机制上的不同表现在两点:1.如何定义方法;2. 如何处理抛出的异常.请看下面CheckedExc

浅谈Go语言中字符串和数组_Golang

go语言里边的字符串处理和PHP还有java 的处理是不一样的,首先申明字符串和修改字符串 复制代码 代码如下: package main import "fmt" var name string           //申明一个字符串 var emptyname string = "" //申明一个空字符串 func main() {  //申明多个字符串并且赋值  a, b, v := "hello", "word", &

C语言中多维数组的内存分配和释放(malloc与free)的方法_C 语言

如果要给二维数组(m*n)分配空间,代码可以写成下面: 复制代码 代码如下: char **a, i; // 先分配m个指针单元,注意是指针单元 // 所以每个单元的大小是sizeof(char *) a = (char **) malloc(m * sizeof(char * )); // 再分配n个字符单元, // 上面的m个指针单元指向这n个字符单元首地址 for(i = 0; i < m; i++) a[i] = (char * )malloc(n * sizeof(char )); 释

c 字符串输入-c语言中如何动态输入字符串而不需要事先定义字符数组大小

问题描述 c语言中如何动态输入字符串而不需要事先定义字符数组大小 如标题 c语言中如何动态输入字符串而不需要事先定义字符数组大小或为字符指针分配空间 解决方案 你这个要求实际使用度太低,或者说,完全没有必要非要这样去想. 解决方案二: c语言中字符串与字符数组c语言中的字符数组与字符串C语言 字符数组和字符串 解决方案三: 你这样定义好了char *p; 解决方案四: #include #include #include #define Step 10 //空间增加的步长. char * get

C++中关于[]静态数组和new分配的动态数组的区别分析_C 语言

本文以实例分析了C++语言中关于[]静态数组和new分配的动态数组的区别,可以帮助大家加深对C++语言数组的理解.具体区别如下: 一.对静态数组名进行sizeof运算时,结果是整个数组占用空间的大小: 因此可以用sizeof(数组名)/sizeof(*数组名)来获取数组的长度. int a[5]; 则sizeof(a)=20,sizeof(*a)=4.因为整个数组共占20字节,首个元素(int型)占4字节. int *a=new int[4];则sizeof(a)=sizeof(*a)=4,因为