C语言两种方式实现矩阵的转置
#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语言两种方式实现矩阵的转置的更多相关文章
- R语言两种方式求指定日期所在月的天数
R语言两种方式求指定日期所在月的天数 days_monthday<-function(date){ m<-format(date,format="%m& ...
- 通过调用C语言的库函数与在C代码中使用内联汇编两种方式来使用同一个系统调用来分析系统调用的工作机制
通过调用C语言的库函数与在C代码中使用内联汇编两种方式来使用同一个系统调用来分析系统调用的工作机制 前言说明 本篇为网易云课堂Linux内核分析课程的第四周作业,我将通过调用C语言的库函数与在C代码中 ...
- C语言中存储多个字符串的两种方式
C语言中存储多个字符串的两种方式 方式一 二维字符串数组 声明: char name[][] = { "Justinian", "Momo", " ...
- WebService的两种方式Soap和Rest比较
我的读后感:由于第一次接触WebService,对于很多概念不太理解,尤其是看到各个OpenAPI的不同提供方式时,更加疑惑.如google map api采用了AJAX方式,通过javascript ...
- WebService的两种方式SOAP和REST比较 (转)
我的读后感:由于第一次接触WebService,对于很多概念不太理解,尤其是看到各个OpenAPI的不同提供方式时,更加疑惑.如google map api采用了AJAX方式,通过javascript ...
- 简介C#读取XML的两种方式
简介C#读取XML的两种方式 作者: 字体:[增加 减小] 类型:转载 时间:2013-03-03 在程序中访问进而操作XML文件一般有两种模型,分别是使用DOM(文档对象模型)和流模型,使用DOM的 ...
- 将html页改成jsp的两种方式
将html页改成jsp的两种方式 作者: 字体:[增加 减小] 类型:转载 时间:2013-08-13 将html页改成jsp有两种方法,第一种是直接修改html文件,另一种是新建jsp文件.下面为大 ...
- Log4Net日志记录两种方式
简介 log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台.文件.数据库等)的工具. log4net是Ap ...
- ASP.NET 生成二维码(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
最近做项目遇到生成二维码的问题,发现网上用的最多的是ThoughtWorks.QRCode和QrCode.Net两种方式.访问官网看着例子写了两个Demo,使用过程中发现两个都挺好用的,Thought ...
随机推荐
- Which Uri Encoding method should i use in C#/.net?
June 19, 2015 This too is one of the boring "factual" posts. Sorry Lachlan. I never know w ...
- Java SimpleDateFormat工具类
package AnimalDemo; import java.text.ParseException; import java.text.SimpleDateFormat; import java. ...
- DELPHI XE5 跨平台 Form ShowModal 官方示例
Calling ShowModal as an Anonymous Method on All Platforms procedure THeaderFooterForm.btnPickClick(S ...
- c#winform pictureBox使用url加载图片
string url = "http://b.hiphotos.baidu.com/image/pic/item/03087bf40ad162d93b3a196f1fdfa9ec8b13cd ...
- python-webdriver库之Keys
在使用webdriver时,有些时候我们需要做一些键盘上特殊键的操作,例如backspace,ctrl,shift等,这个时候就需要用到webdriver.common.keys.Keys方法来进行 ...
- 将php命令加入cenos环境变量
0.修改/etc/profile文件使其永久性生效,并对所有系统用户生效,在文件末尾加上如下两行代码 1.PATH=$PATH:/usr/local/webserver/php/bin:/usr/lo ...
- redis集群如何解决重启不了的问题
redis使用集群部署,如果遇到断电或者服务器重启,当再次启动的时候,有时候会启动不了.需要使用trib的fix命令进行修复.如果修复还是不行的话,可以清除节点数据再重新建集群,前提要备份之后操作. ...
- docker kubernetes swarm spring cloud结合学习资源
http://www.docin.com/p-2062732301.html https://blog.csdn.net/michael_hm/article/details/79213839 htt ...
- Hibernate的工作流程以及三种状态
Hibernate的工作流程: 1. 读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3. 打开Sesssion 4.创建事务Transation 5. 持久化操作 6. ...
- resultType和resultMap的区别
1.resultType和resultMap的区别 1>resultType 返回的结果类型 2>resultMap 描述如何将结果集映射到Java对象 2.resultMap节点 1&g ...