MATLAB矩阵的操作(第二部分)

师从清风

矩阵的创建方法


在MATLAB中,矩阵的创建方法主要有三种,分别是:直接输入法、函数创建法和导入本地文件中的数据。

直接输入法

输入矩阵时要以中括号“[ ]”作为标识符号,矩阵的所有元素必须都在中括号内。
矩阵的同行元素之间用空格或逗号分隔,行与行之间用分号或回车键分隔。

a = [1 2 3; 4 5 6]
b = [1,2,3; 4,5,6]
c = [2  5
    6  7]
d = [3 6;
    6 9]   % 还可以既加分号又加回车键进行换行

如果不想显示输出结果,可以在语句的最后用英文分号“;”结束。(工作区还是可以找到我们创建的矩阵)

e = [2, 3
     5, 7];

函数创建法


MATLAB提供了一些函数,这些函数可以用来生成某些特定的矩阵,我们这里介绍几个最常用到的函数。

 zerosoneseye


这三个函数可用来分别创建全为0的矩阵、全为1的矩阵和单位矩阵。
以zeros函数为例,其常见的用法有两种:
(1)zeros(n)可以创建一个n行n列全为0的矩阵;
(2)zeros(m,n)可以创建一个m行n列全为0的矩阵。
a = zeros(3)  b = zeros(2,3)  c = ones(5)   d = ones(1,4)
单位矩阵:主对角线元素为 1 且其他位置元素为 0 。
e = eye(4)
f = eye(4,3)  

g = eye(3,4)  

 rand、randi和randn


这三个函数分别用来创建均匀分布的随机数、均匀分布的随机整数和标准正态分布的随机数


rand函数可用来创建区间0到1均匀分布的随机数,其最常用的方法有两种:
(1)rand(n)可以创建一个n行n列的随机数矩阵;
(2)rand(m,n)可以创建一个m行n列的随机数矩阵。
由rand函数创建的随机数矩阵的每个元素都随机取样自0和1之间的均匀分布。
rand(3)     rand(3,2)
randi函数是用来创建均匀分布的随机整数(randi后的i是integer的缩写),其最一般的使用方法为:randi([imin,imax],m,n),可以用来创建一个m行n列的随机数矩阵,该随机数矩阵中的每个元素都是从区间[imin,imax]内随机抽取的整数。
例子:假设我们要模拟投掷100次骰子,骰子有6个面,那么我们可以使用randi([1,6],1,100)得到一个长度为100的行向量,向量中的每个元素都是取自1,2,3,4,5,6中的一个整数。
randi([1,6],1,100)  % 这里我生成一个行向量,也可以生成列向量
另外,如果imin等于1,那么可以简写为randi(imax,m,n)
randi(6,1,100)
如果m和n相同,即生成一个n行n列的方阵,那么可以直接写成randi([imin,imax],n)。
randi([-3 3],5)  
randn函数用来创建标准正态分布的随机数(randn后的n是norm distribution的缩写),其使用方法和rand函数类似:
(1)randn(n)可以创建一个n行n列的随机数矩阵;
(2)randn(m,n)可以创建一个m行n列的随机数矩阵。
注:1、由randn函数创建的随机数矩阵的每个元素都随机取样自标准正态分布。
        2、标准正态分布:以0为均值、以1为标准差的正态分布,记为N(0,1).

diag和blkdiag


diag函数可用来创建对角矩阵或者获取矩阵的对角元素(diagonal 对角的)。
情况1:如果输入的第一个参数是向量,则表示创建对角矩阵。
    diag(v,k) 将向量v的元素放置在第k条对角线上,其他位置元素为0。
    k=0 表示主对角线,k>0 位于主对角线上方,k<0 位于主对角线下方。
    如果k=0, 可以直接写成diag(v)。
diag([1,2,3])  % 或者写成diag([1,2,3], 0)  

diag([1,2,3],-1)

情况2:如果输入的第一个参数是矩阵,则表示获取矩阵的对角元素。
    diag(A,k) 返回A的第k条对角线上元素的构成的列向量。
    k表示对角线编号,我们将其指定为一个整数。
    k=0 表示主对角线,k>0 位于主对角线上方,k<0 位于主对角线下方。
    如果k=0, diag(A, 0)可以直接写成diag(A)。


blkdiag函数可用来创建分块对角矩阵(block diagnoal 分块对角)。
分块对角矩阵是相对于常规的对角矩阵而言的,常规的对角矩阵沿对角线具有单个元素,而分块对角矩阵的对角线的元素是矩阵。
我们可采用以下形式表示一个分块对角矩阵:
A1 = [1,2,3;4,5,6]
A2 = [7,8;9,10]
A3 = [11,12;13,14;15,16]
blkdiag(A1,A2,A3)

导入本地文件中的数据


MATLAB可读取本地的文件,支持的常见格式如下:
.txt、.dat 或 .csv(适用于带分隔符的文本文件)
.xls、.xlsb、.xlsm、.xlsx、.xltm、.xltx 或 .ods(适用于电子表格文件)

矩阵元素的引用

双下标索引


我们可以使用矩阵元素所处的行(row)和列(column)来进行引用矩阵的某一个元素,方式为:a(row_ind, column_ind). 
 

size函数

可以使用size函数来计算矩阵的大小

有三种常见的用法:
(1)size(A) 返回一个行向量,其元素是 A 的相应维度的长度。
A = ones(4,6) % 全为1的矩阵
s = size(A)   % 返回[4,6],表示有4行和6列


(2)size(A,dim)返回在维度dim上的长度。dim=1表示行;dim=2表示列
r_num = size(A,1)  % 行数  r_num=4
c_num = size(A,2)   % 列数 c_num=6

注意:即使A是一个向量,size(A)返回的结果也是一个向量,而不是向量的长度。
A = 1:5;  % 行向量:[1 2 3 4 5]
size(A)=1  5
(3)size函数可以有两个返回值
第一个返回的元素用来保存行数;第二个返回的元素用来保存列数
A = zeros(3,5)
[r, c] = size(A)     %输出 r=3  c=5

length函数和numel函数也可以用在矩阵上。
length函数会返回行和列的较大值
A = ones(3,4)
length(A)=4
numel函数会返回矩阵中元素的总数
numel(A)=3*4=12

有时候我们需要取出矩阵的某一行或者某一列。以取出矩阵A的第一行为例,我们可以使用代码A(1, 1:end),即row_ind取1表示第一行,column_ind取1:end表示从1到最后一列的索引。
A = randi([2,10],4,5) 
A(1,1:end)
这时候我们可以直接将其简写为:A(1, :),逗号后面是列索引的位置,加一个冒号就表示取出每一列的元素。
A(1,:)
同理,要取第一列的所有元素,我们可以使用代码:A(:, 1)
A(:, 1)
总结:
A(:, n) 表示矩阵A的第n列的所有元素。
A(m, :) 表示矩阵A的第m行的所有元素。

线性索引(单下标)


使用单个下标对矩阵进行索引这种单下标的索引方法称为线性索引。
事实上,在MATLAB中,矩阵的数据在计算机的内存中被存储为单列。以下图为例,下面的矩阵虽然显示为 3×3 矩阵,但MATLAB在内存中将它存储为单列,由它的各列顺次连接而成。

我们可以利用线性索引来取出矩阵中的元素,尽管这种方式并不那么直观。
举个例子:

A(:)命令可以将A中的所有元素按照线性索引的方式重构成一个列向量,这个命令后面会经常用到。

sub2ind和ind2sub函数

可用于在矩阵的原始索引(双下标)和线性索引之间进行转换(用到频率不高)(subscript 下标)。
sub2ind将矩阵的下标转换为线性索引
ind = sub2ind(sz,row,col) 针对大小为 sz 的矩阵返回由 row 和 col 指定的行列下标的对应线性索引 ind。此处,sz 是包含两个元素的向量,其中 sz(1) 指定行数,sz(2) 指定列数。
ind2sub将线性索引转换为下标[row,col] = ind2sub(sz,ind) 返回数组 row 和 col,其中包含与大小为 sz 的矩阵的线性索引 ind 对应的等效行和列下标。此处,sz 是包含两个元素的向量,其中 sz(1) 指定行数,sz(2) 指定列数。
 

矩阵元素的修改和删除


1、可以直接利用等号赋值的方法对引用位置的元素进行修改,用法和对向量元素的修改类似。

2、可以使用线性索引(单下标的索引)的方式对矩阵的元素进行修改:

3、对矩阵进行拓展
通过将一个或多个元素置于矩阵现有的行和列索引边界之外,可以将它们添加到矩阵中。MATLAB 会自动用 0 填充矩阵,使其保持为矩形。

还可以通过在现有索引范围之外插入新矩阵来扩展其大小。

如果我们将等号右侧变成空向量[ ],则可以删除对应位置的元素。需要注意的是,通常只能删除矩阵的整行或者整列,否则会报错。


注意,也可以通过线性索引来删除矩阵的元素。使用线性索引删除后,MATLAB会将矩阵中剩下的元素按照线性索引的顺序放入到一个向量中。另外,使用线性索引可以删除任意位置的元素,不需要删除矩阵的一整行或者一整列。

矩阵的拼接和重复

矩阵的拼接


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


如上图所示:横向拼接要求矩阵的行数相同;纵向拼接要求矩阵的列数相同。
在MATLAB中,我们可以使用命令[A, B] 或 [A  B]对矩阵A和B进行横向拼接,也可以使用MATLAB中的内置函数:horzcat(A,B)
A = [1 6 7; 4 5 7]
B = [3 1; 5 10]
[A, B]

[A B] % 用空格隔开,可以有多个空格
horzcat(A,B)
 cat(2,A,B)


类似的,我们可以使用命令[A; B]对矩阵A和B进行纵向拼接,也可以使用MATLAB中的内置函数:vertcat(A,B)
A = [2 4 5;2 2 4]
B = [1 8 6;6 3 10;1 5 5]
[A; B]
[A
 B]  % 也可以使用回车键进行纵向拼接
vertcat(A,B)
cat(1,A,B)

下面是cat函数的帮助链接:
https://ww2.mathworks.cn/help/matlab/ref/double.cat.html
命令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)

大小不匹配会报错


矩阵的重复


有时候我们需要对同一个矩阵进行重复的堆叠。
例如将矩阵A的内容堆叠在m行n列的新矩阵中,这个新矩阵每一行由n个A组成,每一列由m个A组成。
下面我们画一个示意图:

在MATLAB中,对同一个矩阵进行重复的堆叠的代码为repmat(A,m,n)。


对向量或者矩阵中的元素进行重复,使用到的函数是repelem。(使用较少)
情况1:重复向量v中的元素:repelem(v,n)
当n为一个正整数时,表示把向量v中的每一个元素都重复n次;
n也可以为一个向量,其长度必须和v的长度相同,它可以将v的每个元素指定重复n对应元素的次数。

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

若有侵权,请联系作者

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

零基础学Python之核心基础知识

1.Python入门简介 &#xff08;1&#xff09;什么是Python Life is short, you need Python&#xff01;人生苦短&#xff0c;我用Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性&#xff0c;相比其他语言…

笔记---中国剩余定理

全程学自y总 AcWing.204.表达整数的奇怪方式 给定 2 n 2n 2n 个整数 a a a1, a a a2,…, a a an 和 m m m1, m m m2,…, m m mn&#xff0c;求一个最小的非负整数 x x x&#xff0c;满足 ∀ i ∈ [ 1 , n ] , x ≡ m ∀i∈[1,n],x≡m ∀i∈[1,n],x≡mi ( m o d a (mod a (…

SpringMVC中的文件上传与下载功能,以及虚拟目录的配置

目录 文件下载 文件上传 第一步&#xff1a;添加依赖&#xff1a; 第二步&#xff1a;在SpringMVC的配置文件中添加配置&#xff1a; 三、控制器方法&#xff1a; 虚拟目录配置方式&#xff1a; 前端代码 SpringMVC中的文件上传与下载功能是通过MultipartResolver来实现…

华为鸿蒙DevEco Studio编辑器初体验

目录 前言DevEco Studio编辑器使用准备工作应用/服务运行可视化调试DevEco Studio配置参数列表番外篇&#xff1a;参加鸿蒙生态学堂创新实训营北京站的培训结束语 前言 众所周知华为鸿蒙作为移动应用开发的第三个热门领域&#xff08;前两个热门领域iOS原生、Android原生都已…

半桥式三相无刷直流电动机不同导通角的性能的变化

半桥式三相无刷直流电动机不同导通角的性能的变化 syms Omega clear clcOmega0pi/180*120 for Omega_x[pi/180*120,pi/180*130,pi/180*140,pi/180*150,pi/180*160,pi/180*170,pi/180*180]Omega_x*180/piOmega_x_0 (4*sin(Omega_x/2)/(Omega_xsin(Omega_x)))/(4*sin(Omega0/2)/…

数据结构—基础知识:哈夫曼编码

数据结构—基础知识&#xff1a;哈夫曼编码 哈夫曼编码的主要思想 在进行数据压缩时&#xff0c;为了使压缩后的数据文件尽可能短&#xff0c;可采用不定长编码。其基本思想是&#xff1a;为出现次数较多的字符编以较短的编码。为确保对数据文件进行有效的压缩文件和对压缩文…

基于数据挖掘的微博事件分析与可视化大屏分析系统

设计原理&#xff0c;是指一个系统的设计由来&#xff0c;其将需求合理拆解成功能&#xff0c;抽象的描述系统的模块&#xff0c;以模块下的功能。功能模块化后&#xff0c;变成可组合、可拆解的单元&#xff0c;在设计时&#xff0c;会将所有信息分解存储在各个表中&#xff0…

元素的显示与隐藏,精灵图,字体图标,CSSC三角

元素的显示与隐藏 类似网站广告&#xff0c;当我们点击关闭就不见了&#xff0c;但是我们重新刷新页面&#xff0c;会重新出现 本质&#xff1a;让元素在页面中隐藏或者显示出来。 1.display显示隐藏 2.visibility显示隐藏 3.overflow溢出显示隐藏 1.display属性&#xff08;…

麒麟系统—— openKylin 安装 Maven

麒麟系统—— openKylin 安装 Maven 一、准备工作1. 确保麒麟系统 openKylin 已经安装完毕。2. 确保 java 已经安装完毕 二、下载Maven三、解压 Maven 与环境配置解压配置环境变量验证 最终&#xff1a;介绍配置的其他参数使用 本文将分享如何在麒麟操作系统 openKylin 上安装…

互补滤波算法介绍+SCL源代码(收放卷线速度处理)

工程上对测量信号进行处理,我们可以利用低通滤波器,还可以利用滑动平均值滤波等,关于低通滤波器和滑动平均值滤波器,可以参考专栏相关文章,常用链接如下: 博途PLC一阶滞后低通滤波器(支持采样频率设置) https://rxxw-control.blog.csdn.net/article/details/132972093h…

cesium-加载地形图

废话不多说 直接代码 <template><div id"cesiumContainer" style"height: 100vh;"></div><div id"toolbar" style"position: fixed;top:20px;left:220px;"><el-breadcrumb><el-breadcrumb-item>…

如何解决jenkins插件下载失败问题

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 从 jenkins 官网上下载的 jenkins&#xff0c;在安装的过程中&a…

MacBook安装虚拟机Parallels Desktop

MacBook安装虚拟机Parallels Desktop 官方下载地址: https://www.parallels.cn/pd/general/ 介绍 Parallels Desktop 被称为 macOS 上最强大的虚拟机软件。可以在 Mac 下同时模拟运行 Win、Linux、Android 等多种操作系统及软件而不必重启电脑&#xff0c;并能在不同系统间随…

Unity Shader 滚动进度条效果

Unity Shader 滚动进度条效果 前言项目场景布置导入图片修改场景设置修改图片尺寸即可调整进度 ASE连线 前言 UI要实现一个滚动进度&#xff0c;于是使用Shader制作一个。 项目 场景布置 导入图片 修改一下导入图片的格式&#xff0c;这样才能循环起来 WrapMode改为Repea…

线性代数:线性方程组

目录 一、线性方程组概念 二、消元法求线性方程组 三、系数阵的秩与线性方程组的解 无解 唯一解 无数解 相关定理 一、线性方程组概念 二、消元法求线性方程组 三、系数阵的秩与线性方程组的解 无解 唯一解 无数解 相关定理

STM32时钟系统

一、什么是时钟系统 时钟系统由振荡器&#xff08;信号源&#xff09;、定时唤醒器、分频器等组成的电路。 振荡器&#xff1a;用来产生重复电子讯号的电子元件。其构成的电路叫振荡电路&#xff0c;能将直流电转换为具有一定频率交流信号输出的电子电路或装置。 常见的振荡器…

2024美赛数学建模D题思路源码

赛题目的 赛题目的&#xff1a; 问题描述&#xff1a; 解题的关键&#xff1a; 问题一. 问题分析 问题解答 问题二. 问题分析 问题解答 问题三. 问题分析 问题解答 问题四. 问题分析 问题解答 问题五. 问题分析 问题解答

【FPGA Verilog】各种加法器Verilog

1bit半加器adder设计实例 module adder(cout,sum,a,b); output cout; output sum; input a,b; wire cout,sum; assign {cout,sum}ab; endmodule 解释说明 &#xff08;1&#xff09;assign {cout,sum}ab 是连续性赋值 对于线网wire进行赋值&#xff0c;必须以assign或者dea…

缓存框架jetcache

在实际应用中&#xff0c;并不是单一的使用本地缓存或者redis&#xff0c;更多是组合使用来满足不同的业务场景。 jetcache组件实现了优雅的组合本地缓存和远程缓存。 支持多种缓存类型&#xff1a;本地缓存、分布式缓存、多级缓存。 官网地址&#xff1a;https://github.com…

第二代视频换脸工具facefusion

GitHub - facefusion/facefusion: Next generation face swapper and enhancer官方地址 1.环境安装 Windows - FaceFusion Windows Python winget install -e --id Python.Python.3.10 PIP python -m ensurepip --upgrade GIT winget install -e --id Git.Git