#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. [GO]数组指针做函数参数

    package main import "fmt" //p指向实现数组a,它是指向数组,它是数组指针//*p指向指针指向的内存,就是实参a func modify1(p *[]in ...

  2. Densely Connected Convolutional Networks(緊密相連卷積網絡)

    - Dense blocks where each layer is connected to every other layer in feedforward fashion(緊密塊是指每一個層與每 ...

  3. C# - dynamic 特性

    dynamic是FrameWork4.0的新特性.dynamic的出现让C#具有了弱语言类型的特性.编译器在编译的时候不再对类型进行检查,编译期默认dynamic对象支持你想要的任何特性. 比如,即使 ...

  4. C++程序的目录结构、编译、打包、分发

    管理C++的第三方库以及编译 第三方库这个说法,不知道出自哪里,但一般是指开发者,系统/平台提供商之外的第三个参与者提供的程序库. 大多数开源软件库在软件系统中都是第三方库. 完全不使用库的开发,在9 ...

  5. 我用Django搭网站(3)-表单RSA加密

    之前开发项目时因为种种原因一直使用明文提交,表单直接明文提交非常不安全,只要稍加操作就能轻易获取用户的信息.在众里寻他千百度之后决定使用RSA加密方式,简单可靠. 项目准备 一.安装PyCrypto库 ...

  6. T-SQL查询进阶--理解SQL Server中索引的概念,原理

    简介 在SQL Server中,索引是一种增强式的存在,这意味着,即使没有索引,sql server仍然可以实现应有的功能,但索引可以在大多数情况下提升查询性能,在OLAP(On line Trans ...

  7. Vue 自定义header

    第一种,全局设置: Vue.http.headers.common['token'] = 'YXBpOnBhc3N3b3Jk'; 第二种,拦截器设置 Vue.http.interceptors.pus ...

  8. jstack应用-查找CPU飚高的原因

    场景 在系统上线后,经常会遇到运维的同学跑过来说:“这次发版后,cpu线程使用率到一场,到100%了”.这时候不要慌,可以使用堆转储来分析到底是哪个线程引起的. 查找元凶 发现pid=17850的进程 ...

  9. 单链表倒数第K个节点的查找和显示

    1.使用一个固定长度队列装链表段,当遍历到链表根时,返回队列头元素. class Node{ int value; Node next; public Node(int value){ this.va ...

  10. Atcoder Grand Contest 031B(DP,思维)

    #include<bits/stdc++.h>using namespace std;int a[200007];int b[200007];long long dp[200007];lo ...