矩阵倒置

文字描述

倒置:把矩阵A的行换成相应的列,得到的新矩阵称为A的转置矩阵,记作AT或A。

通常矩阵的第一列作为转置矩阵的第一行,第一行作为转置矩阵的第一列。

那么,在已经存储好的三元组的顺序存储结构中,如果如何实现矩阵的倒置呢???

 

第一反应肯定是直接遍历,然后行列对换即可,但是因为要求按照行号优先(也可以是列号优先,但是必须倒置前和倒置后都按照一种优先的方式排列),所以如果直接对换,那么就会变得没有顺序,还需要一次排序,这样反而不妙。

1、正常倒置

 

既然要进行行列对换,那么对换后的行号就是对换前的列号,因此可以多次扫描列号,

从列号小的开始扫描对换,那么进行对换后一定能够满足行号优先

2、快速倒置

很显然对于正常的倒置来说,要多次扫描整个存储空间,浪费大量的时间,因此可以对其进行优化

我们可以首先记录每一列(倒置后就是行)有多少元素,然后预留出空间

 

然后一遍扫描直接将其元素放入合适的预留位置即可

代码实现

1、正常倒置

/** 
* @Stone6762 
*/ 
public SparseArray transpose() { 
SparseArray tm = new SparseArray(nums);// 创建一个转置后的矩阵对象 
tm.cols = rows;// 行列变化,非零个数不变 
tm.rows = cols; 
tm.nums = nums; 
int q = 0; 
// 从小到大扫描列号,然后进行变化 
for (int col = 0; col < cols; col++) { 
for (int p = 0; p < nums; p++) { 
if (data[p].getColumn() == col) { 
tm.data[q].setColumn(data[p].getRow()); 
tm.data[q].setRow(data[p].getColumn()); 
tm.data[q].setValue(data[p].getValue()); 
q++; 



return tm; 
}


2、快速倒置

/** 
* @Stone6762 
*/ 
public SparseArray fastTranspose() { 
/* 
* 首先将位置进行预留,然后再“填空”。 num [cols];每一个“空”的大小 。 
copt[cols];每一个“空”的起始位置 
*/ 
SparseArray tm = new SparseArray(nums);// 创建一个转置后的对象 
tm.cols = rows;// 行列变化,非零元素个数不变 
tm.rows = cols; 
tm.nums = nums; 
int tCol = 0, indexOfC = 0; 
if (nums > 0) { 
int[] num = new int[cols];// 原始矩阵中第Col列的非零元素的个数 
int[] copt = new int[cols];// 初始值为N中的第col列的第一个非零元素在TM中的位置 
// 初始化num和copt数组 
for (int i = 0; i < nums; i++) { 
tCol = data[i].getColumn(); 
num[tCol]++; 

copt[0] = 0; 
for (int i = 1; i < cols; i++) { 
copt[i] = copt[i - 1] + num[i - 1]; 

// 找到每一个元素在转置后的三元组中的位置 
for (int i = 0; i < nums; i++) { 
tCol = data[i].getColumn();// 取得扫描TN中的第i个元素的列值tCol 
indexOfC = copt[tCol];// 取得该tCol列的下一个元素应该存储的位置 
tm.data[indexOfC].setRow(data[i].getColumn()); 
tm.data[indexOfC].setColumn(data[i].getRow()); 
tm.data[indexOfC].setValue(data[i].getValue()); 
copt[tCol]++;// 此时的copt[col]表示的是下一个该 col列元素会存储的位置 


return tm; 
}

时间: 2024-08-04 01:52:53

矩阵倒置的相关文章

python 下矩阵倒置的实现

Python下矩阵倒置,可以用双重循环,或者是zip实现. 循环实现: 嵌套的列表推导式 matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]matrix_t = [[row[col] for row in matrix] for col in range(len(matrix[0]))]matrix_t[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]] 原理很简单:先循环列,在固定列上循环每一行

读取wav文件绘制波形图

# -*- coding: utf-8 -*- import wave import pylab as pl import numpy as np from pyaudio import PyAudio,paInt16 def record(filename): #define of params NUM_SAMPLES = 2000 framerate = 16000 channels = 1 sampwidth = 2 #record time TIME = 10 def save_wave

数据结构Java实现——④数组—&gt;稀疏矩阵三元组顺序存储--&gt;矩阵的倒置

作者信息 文字描述 倒置:把矩阵A的行换成相应的列,得到的新矩阵称为A的转置矩阵,记作AT或A. 通常矩阵的第一列作为转置矩阵的第一行,第一行作为转置矩阵的第一列. 那么,在已经存储好的三元组的顺序存储结构中,如果如何实现矩阵的倒置呢??? 第一反应肯定是直接遍历,然后行列对换即可,但是因为要求按照行号优先(也可以是列号优先,但是必须倒置前和倒置后都按照一种优先的方式排列),所以如果直接对换,那么就会变得没有顺序,还需要一次排序,这样反而不妙. 1.正常倒置 既然要进行行列对换,那么对换后的行号

矩阵 ACdream1213 Matrix Multiplication

传送门:点击打开链接 题意:将一个矩阵A先转置,然后再与原A矩阵相乘,求最后得到的矩阵中的数字之和 思路:刚开始没看懂题目,,,随便写几个矩阵A,然后倒置后相乘找规律,一下子就能发现规律,最后的答案等于每一行数字之和的平方之和 #include<map> #include<set> #include<cmath> #include<stack> #include<queue> #include<cstdio> #include<

图片变换【Matrix】矩阵 简介

Matrix矩阵介绍 官方文档地址:https://developer.android.com/reference/android/graphics/Matrix.html 在Android中,对图片的处理需要使用到Matrix类,Matrix是一个3 x 3的矩阵,内部就是个一维数组,内部有9个元素,可以通过setValues(float[])进行初始化,通过getValues(float[])把拿到的矩阵值赋给传入的数组. 源码中的介绍就一句话:The Matrix class holds

BZOJ_1778_[Usaco2010_Hol]_Dotp_驱逐猪猡_(期望动态规划+高斯消元+矩阵)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1778 炸弹从1出发,有\(\frac{P}{Q}\)的概率爆炸,如果不爆炸,等概率移动到连通的点.求在每个点爆炸的概率. 分析 我们构造一个\(n\)行\(n\)列的矩阵\(f\),其中\(f[i][j]\)表示从\(i\)移动到\(j\)的概率. 那么\(f^2\)中\(f^2[i][j]\)是\(f[i][k]\times{f[k][j]}\)得来的,也就是\(i\to{k}\to{j}

JAMA:Java矩阵包

原文链接:JAMA:Java矩阵包 API文档链接:线性代数Java包 JAMA jama是一个非常好用的java的线性代数软件包.适用于日常编程可能碰到的各种矩阵运算问题,提供了一个优雅的简便的解决方案. jama:java 矩阵包 背景 jama是一个基本的线性代数java包,它提供了实数非稀疏矩阵类,程序员可构造操控这些类.对于经常使用到矩阵运算的码农来说,即使不精通线性代数也没有关系,因为jama包提供的功能已经够用,调用方便,使用自然,而且易于理解.Jama包意欲称为java的标准矩阵

码农眼中的数学之~矩阵专栏(附Numpy讲解)

2.矩阵专栏¶ 吐槽一下:矩阵本身不难,但是矩阵的写作太蛋疼了 (⊙﹏⊙)汗 还好有Numpy,不然真的崩溃了... LaTex有没有一个集成了很多常用公式以及推导或者含题库的在线编辑器? 代码裤子:https://github.com/lotapp/BaseCode 在线编程系:https://mybinder.org/v2/gh/lotapp/BaseCode/master 数学基础:https://www.cnblogs.com/dotnetcrazy/p/9294292.html Num

矩阵乘法的Strassen算法详解

题目描述 请编程实现矩阵乘法,并考虑当矩阵规模较大时的优化方法. 思路分析 根据wikipedia上的介绍:两个矩阵的乘法仅当第一个矩阵B的列数和另一个矩阵A的行数相等时才能定义.如A是m×n矩阵和B是n×p矩阵,它们的乘积AB是一个m×p矩阵,它的一个元素其中 1 ≤ i ≤ m, 1 ≤ j ≤ p. 值得一提的是,矩阵乘法满足结合律和分配率,但并不满足交换律,如下图所示的这个例子,两个矩阵交换相乘后,结果变了: 下面咱们来具体解决这个矩阵相乘的问题. 解法一.暴力解法 其实,通过前面的分析