数学建模 —— MATLAB中的矩阵(下)

目录

矩阵的拼接

矩阵的重复

矩阵的重构和重新排列

 (1)reshape 函数

 (2)sort 函数

 (3)sortrows 函数

(4)flip / fliplr / flipud 函数 

(5)rot90 函数


矩阵的拼接

有时候我们需要对多个矩阵进行拼接,变成一个大的矩阵。根据矩阵拼接的方向,我们可 以分为横向(水平)拼接和纵向(垂直)拼接,如下图所示:

在MATLAB  中,我们可以使用命令[ A , B ] 或 [A  B]对矩阵A 和 B 进行横向拼接,也可 以使用MATLAB中的内置函数:horzcat(A , B); 类似的,我们可以使用命令[A ; B]矩阵A 和 B 进行纵向拼接,也可以使用MATLAB中的内置函数:vertcat(A,B)。

事实上,horzcat 和 vertcat 两个函数来源自cat 函数,这里的cat 不是猫的意思,而是单词 catenate 的缩写,可以翻译成连接。

cat函数的用法如下:

命令 cat(dim,A,B)  表示沿着维度dim 方向将矩阵B 拼接到矩阵A 的末尾。

dim = 1 时表示沿着行方向从上往下进行拼接,即纵向拼接,因此 cat(1,A,B)等价于 vertcat(A,B);

dim = 2 时表示沿着列方向从左自右进行拼接,即横向拼接,因此 cat(2,A,B)等价于 horzcat(A,B)。

(horzcat 函数中的 horz 取自英文单词horizontal, 表示水平的意思;vertcat 函数中的 vert 取自英文单词vertical,  表示竖直的意思)

总结:若A B 的行数相同,那么使用[A,B]、[A B]、horzcat(A,B)以及 cat(2,A,B)都能  将A B 横向拼接成一个大的矩阵;若A B 的列数相同,那么使用[A;B]、vertcat(A,B)以  cat(1,A,B)都能将A B 纵向拼接成一个大的矩阵。

 注意,如果要拼接的矩阵的个数大于2,也能使用上面的方法进行拼接,请看下面的例子:


矩阵的重复

除了对矩阵进行拼接外,有时候我们需要对同一个矩阵进行重复的堆叠。如下图所示,我们将矩阵A 重复堆叠m×n 次,得到一个新的矩阵:

 除了对整个矩阵进行重复的堆叠外,MATLAB还可以对向量或者矩阵中的元素进行重复, 使用到的函数是repelem。(如何记住repelem:repeat重复 + element 元素)

repelem 函数有两种用法:

(1)重复向量v 中的元素: repelem(v,n)

当n 为一个正整数时,表示把向量v 中的每一个元素都重复n 次 ;n 也可以为一个 向量,其长度必须和v 的长度相同,它可以将v 中 第i 个位置的元素v(i)重复n(i) 次,其中n(i)表示n 中第i 个位置的元素。

(2)重复矩阵A 中的元素: repelem(A,m,n)

m 和 n 分别表示沿着行方向(从上至下)以及沿着列方向(从左至右)将矩阵元素重复 的次数,这里的m 和n 可以是正整数,也可以是向量。如果m 是向量,则m 的长 度要和矩阵A 的行数相同;如果n 是向量,则n 的长度要和矩阵A的列数相同。


矩阵的重构和重新排列

函数名主要作用
reshape更改矩阵的形状
sort对向量或者矩阵进行排序
sortroWS基于矩阵的某一列对矩阵进行排序,同一行的元素不会改变
rot90将矩阵按逆时针方向旋转90度或者90度的倍数
flip / fliplr / flipud将矩阵进行翻转,fliplr是左右翻转,flipud是上下翻转

(1)reshape 函数

reshape函数可以改变矩阵的形状,其常用语法为reshape(A,m,n)或者reshape(A,[m,n]), 这可以将矩阵A 的形状更改为m 行 n 列,前提是转换前后的两个矩阵的元素总数要相同。

例如有一个矩阵A, 它原来的形状是2行6列,如果我们需要将其形状变成3行4列,就 可以使用命令: reshape(A,3,4).

从上面的运行结果可以看出, reshape 函数实际上是按矩阵的线性索引来重新组织矩阵元素的。因此,转换后的B 矩阵中的元素和A 矩阵中的元素是完全相同的,即A(:)和B(:) 的结果完全相同。

另外,我们不需要自己来计算转换后的矩阵有多少行或多少列。可以只给出转换后的行数, 列数用空向量[ ]代替;或者只给出转换后的列数,行数用空向量[ ]代替。MATLAB会自动帮我们计算转换后的矩阵大小。例如:若A 是一个由12个元素组成的矩阵,命令reshape(A,3,[ ]) 、 reshape(A,[ ],4)可以实现和 reshape(A,3,4)一样的效果。

如果你给出的转换后的行数和列数的乘积不等于原始矩阵中元素的个数,那么 MATLAB 就会报错:


(2)sort 函数

sort 函数是用于对向量或矩阵进行排序的。如果输入的参数是矩阵的话,还可以对矩阵的 每一行或每一列分别进行排序。

对向量排序

我们先来学习sort 函数对向量排序,假设 v 是一个向量,有下面两种基础的用法:

sort(v)  可以将向量v 按照从小到大的顺序进行升序排列;

sort(v,'descend')可以将向量v按照从大到小的顺序进行降序排列。

注意,上面的用法中,sort 函数只有一个返回值,即排序后的向量;事实上,sort 函数可以有两个返回值,基本用法为:[ sort_v,ind]=sort(v) 。这里 ,sort_v是排序后的向量,ind 是排序后的向量(即sort_v)中的每个元素在原向量(即v)中的索引(即下标、位置)。 我们来看一个具体的例子: 

在上面的例子中,我们让sort 函数返回了两个变量; sort_v 和 ind。它们是两个长度相等 的向量,向量的方向和sort函数中输入的v 向量的方向一致,都是行向量。

对矩阵排序

上面介绍的是sort 函数对向量进行排序的应用,下面我们再来介绍sort 函数对矩阵 A进 行排序的用法: sort(A,dim)

dim=1 时,沿着行方向(从上至下)对矩阵的每一列升序排列

dim=2 时,沿着列方向(从左至右)对矩阵的每一行升序排列

注意:(1)当dim=1 时 ,sort(A,1)  可以直接写成sort(A);(2)      默认是升序排列的,我们可 以在最后面加一个输入参数'descend',  变成从大到小的降序排列;(3)可以有两个返回值,代 表的含义和对向量排序类似,表示排序后的元素在原矩阵所在行或所在列中的索引。


(3)sortrows 函数

sortrows 函数可以基于矩阵的某一列对矩阵进行排序,排序后得到的新矩阵的同一行元素不会改变。这个函数的用法较多,下面我们直接用一个具体的实例来讲解它的主要用法。

假设老师有6名学生,下面这个矩阵保存着这六名同学在四门科目上的成绩。矩阵的每一行代表一名学生。这六名同学的四门科目的成绩对应着四列,例如第一名同学的第一科成绩为95,第二科成绩为80,依此类推。


(4)flip / fliplr / flipud 函数 

flip / fliplr / flipud 这三个函数,它们可以用来对向量或矩阵进行翻转操作。其中,flip 函数是一个通用的翻转函数,而fliplr 和 flipud是其特例,分别用于从左到右和 从上到下的翻转。flip翻译成中文是翻转,而fliplr函数可以拆解为filp+ 左边left+ 右边right,    flipud则可以拆解为flip+ 上边upper+  下边down,  大家可以根据英文来进行记忆。

flip函数有两种用法:

用法1: flip(A)

● 如果A为向量,flip(A)将翻转向量中各元素的顺序,向量的方向不变。

● 如果A为矩阵,flip(A)将对矩阵进行上下翻转。

用法2: flip(A,dim)

flip(A,dim) 沿维度 dim 翻转 A 中元素的顺序。

● dim为1时表示行,此时flip(A,1) 将沿着行方向对矩阵A上下翻转。

● dim为2时表示列,此时flip(A,2)将沿着列方向对矩阵A左右翻转。

flip 函数用法总结: 

  1. (1)若要对向量A中的元素进行翻转且向量的方向不变,那么可以直接使用flip(A).
  2. (2)若要对矩阵A 进行翻转,那么 flip(A) 、flip(A,1)和flipud(A)都能对矩阵A 进行上下翻转;flip(A,2)和fliplr(A)能对矩阵A 进行左右翻转。

(5)rot90 函数

rot90函数是对矩阵进行旋转的函数,它源于英文rotate 一词,中文翻译为旋转。rot90 函 数允许我们按90度或其倍数逆时针旋转矩阵。它的用法非常简单,rot90(A,k)将矩阵A 按逆时针方向旋转k*90 度,其中k 是一个整数;不提供k 时 k 默认取1。我们来看几个例子:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/35597.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++性能优化篇:深拷贝、浅拷贝与移动构造

引言 最近在做性能优化,遇到了一个明显的性能问题,就是在大量数据做深拷贝的时候,程序耗时严重,几乎三分之一的时间都耗在了这里。于是乎仔细看了下此处的代码,发现这些深拷贝完全可以避免。 深拷贝、浅拷贝与移动构…

Java实现RS485串口通信

博客链接地址 近期,我接到了一个任务,将报警器接入到Java项目中,而接入的方式就是通过RS485接入,本人之前可以说是对此毫无所知。不过要感谢现在的互联网,通过网络我查到了我想要知道的一切,这里记录下本次…

对数据分析行业的疑问

我之前是做大数据的开发的,当然也做业务比如Java、springcloud的后端开发、也做了ai的。 但是我一直没怎么做数据分析,当我加入了新公司后发现,现在做大数据的大部分都是数据分析,用python和sql。 我今天一看他们的统计&#xf…

STM32音频应用开发:DMA与定时器的高效协作

摘要: 本文章将深入浅出地介绍如何使用STM32单片机实现音频播放功能。文章将从音频基础知识入手,逐步讲解音频解码、DAC转换、音频放大等关键环节,并结合STM32 HAL库给出具体的代码实现和电路设计方案。最后,我们将通过一个实例演示如何播放W…

NXP RT1060学习总结 - fsl_flexcan CAN FD 函数说明 -1

概要 CAN测试源码: https://download.csdn.net/download/qq_35671135/89425377 根据fsl_flexcan.h文件从文件末尾往前面梳理,总共CAN FD处理函数; 使用的是RT1064开发板进行测试。 1、中止中断驱动的消息接收进程(CAN FD) 函 数 &#xf…

揭示优化Prompt的秘诀:如何让API表现媲美网页版

为什么用GPT API(GPT-3.5-turbo)进行程序分析时,效果好像比网页版的GPT-3.5差一点?这可能有几个原因,咱们细说一下。 1. Prompt不同 这是最常见的问题之一。API调用时的指令(prompt)往往比较简…

Ceil()——向上取整函数

函数原型为: double ceil(double x); 大家可以在这个网站里更清晰的了解ceil - C Reference (cplusplus.com) 下面借助一道例题来帮助大家理解:牛牛的快递_牛客题霸_牛客网 (nowcoder.com) 我们分析题得知,在大于1的情况下,只要…

学懂C#编程:常用高级技术——学会Lambda表达式的应用(二)

上一篇介绍了Lambda基础的知识,接着我们通过讲解Lambda的几种应用场景来彻底学懂Lambda在编程中的应用。 Lambda表达式在C#中非常灵活,可以用在多种场合。以下是一些Lambda表达式示例,帮助你更全面地理解其用途: 1. 数组过滤&am…

【ocean】ocnPrin结合getData导出数据

核心就是这一句ocnPrint(?output fout leafValue( getData(“/output” ?result “dc”))) r_list list(4000, 4100, 4200) multi_list list(20,21,22) fout outfile("/home/yourpath/results.txt" "w") foreach(r_value r_listforeach(multi_value …

【Linux基础命令】文件管理命令(二)

文章目录 前言创建删除目录创建目录删除目录cp命令mv命令查看文件内容总结前言 在我们的上一篇文章中,我们介绍了一些基本的Linux文件管理命令,如 cd、ls 等。这些命令对于日常的文件操作任务非常有用。然而,Linux 提供的功能远不止这些。在本文中,我们将继续探索更多的文…

【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解

最终效果 文章目录 最终效果前言存储位置信息存储更多数据存储场景信息持久化存储数据完结 前言 前面写过小型游戏存储功能: 【unity实战】制作unity数据保存和加载系统——小型游戏存储的最优解(包含数据安全处理方案的加密解密) 这次做一…

基于RK3568车载电脑助力日本巴士公司高效完成巴士到站系统项目部署

无处不在的物联网(IoT)技术已经渗透到了人类生活的各个角落,如日常出行乘坐的公交车上,物联网(IoT)技术的应用就得到完美诠释!其通过公交车上的车载电脑网络与中控室服务器连接来对公交车的运行…

Vue-Ci搭建项目

项目创建 vue-cli 官方提供的一个脚手架,用于快速生成一个vue的项目模板;预先定义 好的目录结构及基础代码,就好比咱们在创建Maven项目时可以选择创建一个 骨架项目,这个骨架项目就是脚手架,我们的开发更加的快速; 主要的功能 ● 统一的目录结构 ● 本地调试 热部署 ● 单元…

Rust详解日志

详解日志 相比起监控,日志好理解的多:在某个时间点向指定的地方输出一条信息,里面记录着重要性、时间、地点和发生的事件,这就是日志。 注意,本文和 Rust 无关,我们争取从一个中立的角度去介绍何为日志 日…

低代码开发平台:人人都可以开发应用

低代码开发平台是一种快速应用开发工具,它允许用户通过图形界面和模型驱动逻辑来构建应用程序,而不需要编写大量的代码。这种平台的目的是简化开发流程,降低技术门槛,使得非专业开发者也能快速构建应用程序。 低代码开发的优势 低…

IBM Spectrum LSF Application Center 提供单一界面来管理应用程序、用户、资源和数据

IBM Spectrum LSF Application Center 提供单一界面来管理应用程序、用户、资源和数据 亮点 ● 简化应用程序管理 ● 提高您的工作效率 ● 降低资源管理的复杂性 ● 深入了解流程 IBM Spectrum LSF Application Center 为集群用户和管理员提供了一个灵活的、以应用为中心的界…

openwrt igmp 适配

每弄完一次,过不多久就忘了,这次决心记下来。 openwrt 的igmpproxy 包是干嘛的?原来,组播包并不能穿透路由,也就是我们在wan端播放的组播视频流,lan端是没法收到的,igmpproxy就是用来打通wan端…

2024.6.26 刷题总结

2024.6.26 **每日一题** 526.优美的排列,该题考察的是状压dp的知识,用一个n位的二进制数表示排列中的数被选取的情况,若为1,则表示该位被选取,若为0,则表示该位没有被选取,用一个数组来存储当前…

STM32F1+HAL库+FreeTOTS学习1——FreeRTOS入门

STM32F1HAL库FreeTOTS学习1——FreeRTOS入门 裸机开发与操作系统嵌入式操作系统简介FreeRTOS简介FreeRTOS的几个重要概念任务调度器任务状态状态列表 裸机开发与操作系统 在以往的嵌入式学习中,我们最常用的就是裸机开发,所谓裸机开发就是指在没有操作系…

力扣1541. 平衡括号字符串的最少插入次数

Problem: 1541. 平衡括号字符串的最少插入次数 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 Problem: 力扣921. 使括号有效的最少添加 类似于上述题目,不过此时一个左括号要和两个右括号配对 1.同理上述题目,遍历字符串时若遇见一个左括…