/*
矩阵乘法C语言实现
Slyar 2009.3.20
*/
 
#include <stdio.h>
#include <stdlib.h>
 
/* 给 int 类型定义别名 datatype */
typedef int datatype;
 
/* 函数声明部分 */
datatype** Create(int m, int n);
void Reset(datatype**, int, int);
void Input(datatype**, int, int);
void Output(datatype**, int, int);
void MatrixMutiply(datatype**, datatype**, datatype**);
void MatrixFree(datatype** , int);
 
/* 定义三个矩阵的行列大小 */
int row_a, col_a;
int row_b, col_b;
int row_c, col_c;
 
/* 定义文件指针 */
FILE *fp;
 
int main()
{
        int i;
        datatype **a, **b, **c;
 
        /* 以只读方式打开输入文件 in.txt */
        if((fp = fopen("in.txt","r")) == NULL)
        {
                printf("Cannot open this file.\n");
                exit(0);
        }
 
        /* 创建并读入矩阵a */
        fscanf(fp,"%d%d", &row_a, &col_a);
        a=Create(row_a, col_a);
        Input(a,row_a, col_a);
 
        /* 创建并读入矩阵b */
        fscanf(fp,"%d%d", &row_b, &col_b);
        b = Create(row_b, col_b);
        Input(b,row_b, col_b);
 
        /* 关闭输入文件 */
        fclose(fp);
 
        /* 以写入方式打开输出文件 out.txt */
        if((fp = fopen("out.txt","w")) == NULL)
        {
                printf("Cannot open this file.\n");
                exit(0);
        }
 
        /* 判断两个矩阵能否相乘 */
        if(col_a == row_b)
        {
                row_c = row_a;
                col_c = col_b;
        }
        else
        {
                fprintf(fp,"Matrix Can't Mutiply !\n");
                exit(0);
        }
 
        /* 创建并初始化结果矩阵c */
        c = Create(row_c, col_c);
        Reset(c, row_c, col_c);
 
        /* 进行矩阵乘法运算 */
        MatrixMutiply(a, b, c);
 
        /* 输出结果矩阵C */
        Output(c, row_c, col_c);
 
        /* 关闭输出文件 */
        fclose(fp);
 
        /* 释放矩阵内存 */
        MatrixFree(a,row_a);
        MatrixFree(b,row_b);
        MatrixFree(c,row_c);
 
        //system("pause");
        return 0;
}
 
/* 为矩阵动态分配内存的函数 */
datatype** Create(int m, int n)
{
        int i;
        datatype **Matrix;
        Matrix = (datatype **) malloc(sizeof(datatype *) * m);
        for(i = 0; i < m; i++)
        {
                Matrix[i] = (datatype *) malloc(sizeof(datatype) * n);
        }
        return Matrix;
}
 
/* 初始化矩阵函数 */
void Reset(datatype** Matrix, int m, int n)
{
        int i,j;
        for(i = 0; i < m; i++)
        {
                for(j = 0; j < n; j++)
                {
                        Matrix[i][j] = 0;
                }
        }
}
 
/* 读入数据函数 */
void Input(datatype** Matrix, int m, int n)
{
        int i,j;
        for(i = 0; i < m; i++)
        {
                for(j = 0; j < n; j++)
                {
                        fscanf(fp,"%d", &Matrix[i][j]);
                }
        }
}
 
/* 输出数据函数 */
void Output(datatype** Matrix, int m, int n)
{
        int i,j;
        for(i = 0; i < m; i++)
        {
                for(j = 0; j < n; j++)
                {
                        fprintf(fp,"%d ", Matrix[i][j]);
                }
                fprintf(fp,"\n");
        }
}
 
/* 矩阵乘法运算函数 */
void MatrixMutiply(datatype** a, datatype** b, datatype** c)
{
        int i,j,k;
        for(i = 0; i < row_c; i++)
        {
                for(j = 0; j < col_c; j++)
                {
                        for(k = 0; k < col_a; k++)
                        {
                                c[i][j] += a[i][k] * b[k][j];
                        }
                }
        }
}
 
/* 释放矩阵内存函数 */
void MatrixFree(datatype** Matrix, int m)
{
        int i;
        for(i = 0; i < m; i++)
        {
                free(Matrix[i]);
        }
        free(Matrix);
}
转载自:http://nickandmiles.blog.163.com/blog/static/234221232011428114811156/

矩阵乘法C语言实现的更多相关文章

  1. C语言实现的矩阵乘法运算器

    需求 编写程序模拟矩阵乘法,一个m*n的矩阵,乘以一个 n*m 的矩阵, 并且输出结果. STEP 1  矩阵乘法的计算 一个m行n列的矩阵与一个n行p列的矩阵可以相乘,得到的结果是一个m行p列的矩阵 ...

  2. [转]OpenBLAS项目与矩阵乘法优化

    课程内容 OpenBLAS项目介绍 矩阵乘法优化算法 一步步调优实现 以下为公开课完整视频,共64分钟: 以下为公开课内容的文字及 PPT 整理. 雷锋网的朋友们大家好,我是张先轶,今天主要介绍一下我 ...

  3. 【bzoj4870】[Shoi2017]组合数问题 dp+快速幂/矩阵乘法

    题目描述 输入 第一行有四个整数 n, p, k, r,所有整数含义见问题描述. 1 ≤ n ≤ 10^9, 0 ≤ r < k ≤ 50, 2 ≤ p ≤ 2^30 − 1 输出 一行一个整数 ...

  4. WUSTOJ 1232: 矩阵乘法(C)

    1232: 矩阵乘法 Time Limit: 1 Sec Memory Limit: 128 MB 64bit IO Format: %lld Description 小明明正在学习线性代数,老师布置 ...

  5. CUDA 矩阵乘法终极优化指南

    作者:马骏 | 旷视 MegEngine 架构师 前言 单精度矩阵乘法(SGEMM)几乎是每一位学习 CUDA 的同学绕不开的案例,这个经典的计算密集型案例可以很好地展示 GPU 编程中常用的优化技巧 ...

  6. *HDU2254 矩阵乘法

    奥运 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submissi ...

  7. *HDU 1757 矩阵乘法

    A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  8. CH Round #30 摆花[矩阵乘法]

    摆花 CH Round #30 - 清明欢乐赛 背景及描述 艺术馆门前将摆出许多花,一共有n个位置排成一排,每个位置可以摆花也可以不摆花.有些花如果摆在相邻的位置(隔着一个空的位置不算相邻),就不好看 ...

  9. POJ3070 Fibonacci[矩阵乘法]

    Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13677   Accepted: 9697 Descri ...

随机推荐

  1. nodejs+mysql入门实例

    此前我已准备好mysql,使用的是PHP的组合包Appserv 手动添加数据库依赖: 在package.json的dependencies中新增, “mysql” : “latest”, { &quo ...

  2. Unity 加密解密

    解密无非就为了 修改游戏功能数据.提取游戏资源.加入自己想加的广告...加密就是保护游戏不被恶意修改,经常看到有人说:"加什么密,你以为自己写的代码很NB?见不得人?"我只想说,加 ...

  3. NSLog 输出格式集合

    • %@ 对象 • %d, %i  整数 • %u  无符整形 • %f  浮点/双字 • %x, %X 二进制整数 • %o  八进制整数 • %zu size_t • %p  指针 • %e  浮 ...

  4. [转]SSIS中的脚本—脚本任务

    本文转自:http://www.cnblogs.com/tylerdonet/archive/2011/09/16/2179123.html 脚本任务主要用来控制数据流,当现有的控制流 任务不能满足复 ...

  5. 关于Django迁移出现问题

    关于Django迁移出现问题 源码: #coding:utf- from django.db import models # Create your models here. class BookIn ...

  6. [转]JQuery - Sizzle选择器引擎原理分析

    原文: https://segmentfault.com/a/1190000003933990 ---------------------------------------------------- ...

  7. [转] 一篇好文 ---steve jobs (stay hungry, stay foolish)

    斯蒂夫•保罗•乔布斯(Steve Paul Jobs,1955年2月24日出生-)是蘋果電腦的現任首席執行長(首席执行官)兼創辦人之一.同時也是Pixar動畫公司的董事長及首席執行長.这是他2005在 ...

  8. mysql结构相同的三张表查询一条记录\将一张表中的数据插入另外一张表

    将一张表中的数据插入另外一张表 1.两张表结构相同 insert into 表1名称 select * from 表2名称 2.两张结构不相同的表 insert into 表1名称(列名1,列名2,列 ...

  9. 算法笔记_056:蓝桥杯练习 未名湖边的烦恼(Java)

    目录 1 问题描述 2 解决方案 2.1 递归法 2.2 递推法   1 问题描述 问题描述 每年冬天,北大未名湖上都是滑冰的好地方.北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰 ...

  10. 算法笔记_049:奇偶数排序(Java)

    目录 1 问题描述 2 解决方案 2.1 一头一尾指针往中间扫描法 2.2 一前一后两个指针同时往后扫描法   1 问题描述 给定一个整数数组,请调整 数组中数的顺序,使得所有奇数位于数组的前半部分, ...