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 ...
随机推荐
- (转)对存储过程进行加密和解密(SQL 2008/SQL 2012)
原文地址:http://www.cnblogs.com/wghao/archive/2012/12/30/2837642.html 开始: 在网络上,看到有SQL Server 2000和SQL Se ...
- Replication--复制问答
在发布表尾部增加字段,需要重新初始化订阅么?答:在发布表尾部增加字段,不需要不需要重新初始化订阅,该修改会自动同步到订阅段,也不需要对复制做任何修改.但如果在同一个发布中增加新的项目,需要重新初始化订 ...
- 80端口被system(pid=4)占用
1.查看80端口被哪个进程占用,cmd->netstat -ano | findstr 80 2.cmd->tasklist列出当前运行中的进程,或在任务管理器中查看pid为4的进程. 经 ...
- SignalR-001
SignalR 是什么? ASP.NET Core SignalR 是一个开放源代码库,它简化了向应用添加实时 web 功能. 实时 web 功能立即使服务器端代码能够将内容推送到客户端. 一.有这么 ...
- 关于jboss的线程问题+java.lang.outofmemoryError
近日来,用Jmeter做压力测试.发现,每台客户机使用800个线程组压力倍增.昨天的测试,到了今天下午都没有跑完. 仔细观察了下Jboss的错误日志,发现,jboss已经宕机了. 本身后台的环境是使用 ...
- linux系统安全及应用——账号安全(用户切换与提权)
一.su命令切换用户 su uesr 和 su - user 的区别:前者只切换登录人,shell环境还是上一个人的:后者表示注销当前用户,再进入新用户的shell. 查看切换记录:/var/log/ ...
- 18、OpenCV Python 简单实现一个图片生成(类似抖音生成字母人像)
__author__ = "WSX" import cv2 as cv import numpy as np def local_threshold(img): #局部阈值 gra ...
- 洛谷 P4859 && BZOJ3622: 已经没有什么好害怕的了
题目描述 给出 \(n\) 个数 \(a_i\) ,以及 \(n\) 个数 \(b_i\) ,要求两两配对使得 \(a>b\) 的对数减去 \(a<b\) 的对数等于 \(k\) . ...
- MITx: 6.00.1x Introduction to Computer Science and Programming Using Python Week 2: Simple Programs 4. Functions
ESTIMATED TIME TO COMPLETE: 18 minutes We can use the idea of bisection search to determine if a cha ...
- HDU6464 (权值线段树)-(查找区间第k1小于第k2小之间的和)
http://acm.hdu.edu.cn/showproblem.php?pid=6464 不理解先看博客:https://blog.csdn.net/g21glf/article/details/ ...