#include"stdio.h"
typedef struct{
int i,j;
int v;
}Triple;
typedef struct{
Triple date[];
int mu,nu,tu;//hang、lie
}TSMatrix; void Trans(TSMatrix &T,TSMatrix &M){//将来会对M的值进行修改,而不会对T的值进行修改,所以M需要传递地址
M.mu=T.nu;
M.nu=T.mu;
M.tu=T.tu;
int l=;
for(int q=;q<T.nu+;q++)
for(int p=;p<T.tu+;p++){
if(T.date[p].j==q){
M.date[l].i=T.date[p].j;
M.date[l].j=T.date[p].i;
M.date[l].v=T.date[p].v;
l++;
}
}
printf("转置后\n");
printf("i j v\n");
for(int k=;k<M.tu+;k++){
printf("%d %d %d\n",M.date[k].i,M.date[k].j,M.date[k].v);
}
}
int main(){
TSMatrix T,M;
T.date[].i=;T.date[].j=;T.date[].v=;T.date[].i=;T.date[].j=;T.date[].v=;T.date[].i=;T.date[].j=;T.date[].v=-;T.date[].i=;T.date[].j=;T.date[].v=;T.date[].i=;T.date[].j=;T.date[].v=;T.date[].i=;T.date[].j=;T.date[].v=;T.date[].i=;T.date[].j=;T.date[].v=;T.date[].i=;T.date[].j=;T.date[].v=-;
T.tu=;
T.nu=;
T.mu=;
printf("转置前\n");
printf("i j v\n");
//printf("%d",T.tu);
for(int k=;k<T.tu+;k++){
printf("%d %d %d\n",T.date[k].i,T.date[k].j,T.date[k].v);
}
Trans(T,M);
printf(" ");
return ;
}

分析:在矩阵的转置中,是将T矩阵的列转为M矩阵的行,在M矩阵中,是以行顺序进行存储,所以,在转置时以T矩阵的列顺序遍历,找出每个T.date[p].j==q,p即在T矩阵中的位置。

改算法的时间复杂度是nu*tu,一般矩阵转置的算法复杂的为mu*nu,所以该算法仅适于tu<<mu*nu(别问我为什么不是tu<mu,我不知道,书上就是这样写的,欢迎指点)

快速转置:

#include"stdio.h"
#define MAX 1000
typedef struct{
int i,j;
int v;
}Triple;
typedef struct{
Triple date[MAX];
int mu,nu,tu;//hang、lie
}TSMatrix;

void Trans(TSMatrix &T,TSMatrix &M,int col){//将来会对M的值进行修改,而不会对T的值进行修改,所以M需要传递地址
//int num[col];  //error C2057: expected constant expression 在定义num[col]时报错,查得col是个变量,一直要到运行期才被分配内存,才会有值,所以编译期的时候它还没有值,故而编译时会出错。
//int cpot[col];//所以设置宏,但是这明显不是最好的办法,如果有更好的方法请大家指点
int q=0;
int num[MAX];
int cpot[MAX];
M.mu=T.nu;
M.nu=T.mu;
M.tu=T.tu;
if(M.tu){
for(int col=1;col<T.mu+1;++col) num[col]=0;
for(int t=1;t<M.tu+1;++t) ++num[T.date[t].j];
cpot[1]=1;
for(int co=2;co<T.mu+1;++co) cpot[co]=cpot[co-1]+num[co-1];
for(int p=1;p<T.tu+1;++p){
col=T.date[p].j;
q=cpot[col];
M.date[q].i=T.date[p].j;
M.date[q].j=T.date[p].i;
M.date[q].v=T.date[p].v;
++cpot[col];
}
}
printf("转置后\n");
printf("i j v\n");
for(int k=1;k<M.tu+1;k++){
printf("%d %d %d\n",M.date[k].i,M.date[k].j,M.date[k].v);
}
}
int main(){
TSMatrix T,M;
T.date[1].i=1;T.date[1].j=2;T.date[1].v=12;T.date[2].i=1;T.date[2].j=3;T.date[2].v=9;T.date[3].i=3;T.date[3].j=1;T.date[3].v=-3;T.date[4].i=3;T.date[4].j=6;T.date[4].v=14;T.date[5].i=4;T.date[5].j=3;T.date[5].v=24;T.date[6].i=5;T.date[6].j=2;T.date[6].v=18;T.date[7].i=6;T.date[7].j=1;T.date[7].v=15;T.date[8].i=6;T.date[8].j=4;T.date[8].v=-7;
T.tu=8;
T.nu=6;
T.mu=6;
printf("转置前\n");
printf("i j v\n");
//printf("%d",T.tu);
for(int k=1;k<T.tu+1;k++){
printf("%d %d %d\n",T.date[k].i,T.date[k].j,T.date[k].v);
}
Trans(T,M,T.nu);
return 0;
}
分析:在转置中有亮点关键1、cpot[1]=1;cpot[co]=cpot[co-1]+num[co-1];这个表示的是各个行列中两个数组的关系,2、++cpot[col];窃以为这个才是整个代码的灵魂,cpot[col]表示col列第一个非零元在M矩阵中的位置,++cpot[col]则表示如果该列不止一个非零元,那++cpot[col]表示该列下个非零元的位置,如果没有下个非零元,则++cpot[col]不再使用。

该算法的时间复杂度是mu*nu

C语言两种方式实现矩阵的转置的更多相关文章

  1. R语言两种方式求指定日期所在月的天数

                 R语言两种方式求指定日期所在月的天数 days_monthday<-function(date){ m<-format(date,format="%m& ...

  2. 通过调用C语言的库函数与在C代码中使用内联汇编两种方式来使用同一个系统调用来分析系统调用的工作机制

    通过调用C语言的库函数与在C代码中使用内联汇编两种方式来使用同一个系统调用来分析系统调用的工作机制 前言说明 本篇为网易云课堂Linux内核分析课程的第四周作业,我将通过调用C语言的库函数与在C代码中 ...

  3. C语言中存储多个字符串的两种方式

    C语言中存储多个字符串的两种方式 方式一    二维字符串数组 声明: char name[][] = { "Justinian", "Momo", " ...

  4. WebService的两种方式Soap和Rest比较

    我的读后感:由于第一次接触WebService,对于很多概念不太理解,尤其是看到各个OpenAPI的不同提供方式时,更加疑惑.如google map api采用了AJAX方式,通过javascript ...

  5. WebService的两种方式SOAP和REST比较 (转)

    我的读后感:由于第一次接触WebService,对于很多概念不太理解,尤其是看到各个OpenAPI的不同提供方式时,更加疑惑.如google map api采用了AJAX方式,通过javascript ...

  6. 简介C#读取XML的两种方式

    简介C#读取XML的两种方式 作者: 字体:[增加 减小] 类型:转载 时间:2013-03-03 在程序中访问进而操作XML文件一般有两种模型,分别是使用DOM(文档对象模型)和流模型,使用DOM的 ...

  7. 将html页改成jsp的两种方式

    将html页改成jsp的两种方式 作者: 字体:[增加 减小] 类型:转载 时间:2013-08-13 将html页改成jsp有两种方法,第一种是直接修改html文件,另一种是新建jsp文件.下面为大 ...

  8. Log4Net日志记录两种方式

     简介 log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台.文件.数据库等)的工具.     log4net是Ap ...

  9. ASP.NET 生成二维码(采用ThoughtWorks.QRCode和QrCode.Net两种方式)

    最近做项目遇到生成二维码的问题,发现网上用的最多的是ThoughtWorks.QRCode和QrCode.Net两种方式.访问官网看着例子写了两个Demo,使用过程中发现两个都挺好用的,Thought ...

随机推荐

  1. HDU 6055 Regular polygon (暴力)

    题意,二维平面上给N个整数点,问能构成多少个不同的正多边形. 析:容易得知只有正四边形可以使得所有的顶点为整数点.所以只要枚举两个点,然后去查找另外两个点就好. 代码如下: #pragma comme ...

  2. easyUI form sumit 中文乱码

    jsp 编码方式: pageEncoding="UTF-8" tomcat 编码方式: <Connector connectionTimeout="20000&qu ...

  3. 第05章-构建Spring Web应用程序

    1. Spring MVC起步 1.1 跟踪Spring MVC的请求 前端控制器DispatcherServlet 请求旅程的第一站是Spring的DispatcherServlet.与大多数基于J ...

  4. 编写高质量代码改善C#程序的157个建议——建议30:使用LINQ取代集合中的比较器和迭代器

    建议30:使用LINQ取代集合中的比较器和迭代器 LINQ提供了类似于SQL的语法来实现遍历.筛选与投影集合的功能. static void Main(string[] args) { List< ...

  5. 解决chrome浏览器无法得到window.showModalDialog返回值的问题

    父页面处理: function ProductList() {   var TypeID = window.document.getElementById("Type").valu ...

  6. whereis libjpeg.so.7

    在服务器上调用import ImageFont时报如下错误 ImportError: The _imagingft C module is not installed (服务器为Centos5.5, ...

  7. MVC 基本概念

    1. M(Model-模型): 数据模型. 负责定义信息格式与信息反问的界面,包括商业逻辑,数据反问.(可以理解成是三层模式中的 BLL+DAL ) 2. V(View-视图): 负责用户界面 UI ...

  8. logback 常用参数配置详解

    logback 常用配置详解(二) <appender> <appender>: <appender>是<configuration>的子节点,是负责写 ...

  9. 七月小说网 Python + GraphQL (三)

    概述 后台数据库几个基本表基本搭建完毕,看了下Github Develop的V4 Api抛弃了RESTful,采用GraphQL,感觉很有意思,一看文档,竟然有Python的开源实现 Graphene ...

  10. SSM项目配置文件及其各项使用

    $说明: ·Spring 5  + Mybatis 3.4.5 +SpringMVC  ·使用druid数据库 ·使用log4j输出日志 $Spring 及其配置文件(部分) Spring官方网站:h ...