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

news2024/12/24 18:18:21

师从清风

矩阵的创建方法


在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的列数相同。

若有侵权,请联系作者

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

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

相关文章

IEC104 S帧超时判定客户与服务端不匹配造成的异常链接问题分析

2、通过ss命令发现确有链接端口变化&#xff0c;与设备约一天一次的重连&#xff0c;通过抓包&#xff08;tcpdump -vvv -nn port 1001 -w 0926.cap&#xff09;分析得以下现象 2.1、异常情况时未对设备的I帧均匀的回S帧进行确认&#xff0c;正常情况时均匀的回S帧进行确认 2.…

数据在内存中的存储(上)

1. 整数在内存中的存储 整数的2进制表示方法有三种&#xff1a;即原码、反码和补码 三种表示方法均有符号位和数值位两部分&#xff0c;符号位都是用0表示“正”&#xff0c;用1表示“负”&#xff0c;而数值位最 高位的一位是被当做符号位&#xff0c;剩余的都是数值位。 正…

深度学习水论文怎么缝模块?搭积木永不过时!(附80个即插即用模型)

深度学习如何创新&#xff1f;如何水模型&#xff1f;总结来说就八个字&#xff1a;排列组合&#xff0c;会讲故事。说直白点&#xff0c;就是缝模块。 先看看别人怎么做&#xff0c;然后根据自己的实际情况将这些模块来一波随机组合&#xff0c;这样效率会高很多。我这边已经…

冰冻天气恰逢春运,“观冰精灵”化身电力供应守护者

据中国路网&#xff0c;截至2月1日14时&#xff0c;受降雪及路面结冰影响&#xff0c;河北、山西、内蒙古、黑龙江、江苏、安徽、河南、山东、西藏、陕西、宁夏、甘肃、新疆共封闭路段66个&#xff08;涉及44条高速公路、5条普通国道、5条普通省道&#xff09;&#xff0c;关闭…

Pandas.Series.clip() 修剪数值范围 详解 含代码 含测试数据集 随Pandas版本持续更新

关于Pandas版本&#xff1a; 本文基于 pandas2.2.0 编写。 关于本文内容更新&#xff1a; 随着pandas的stable版本更迭&#xff0c;本文持续更新&#xff0c;不断完善补充。 传送门&#xff1a; Pandas API参考目录 传送门&#xff1a; Pandas 版本更新及新特性 传送门&…

前端JavaScript篇之map和Object的区别、map和weakMap的区别

目录 map和Object的区别map和weakMap的区别 map和Object的区别 Object是JavaScript的内置对象&#xff0c;用于存储键值对。Object的键必须是字符串或符号&#xff0c;值可以是任意类型。Map是ES6引入的新数据结构&#xff0c;用于存储键值对。Map的键可以是任意类型&#xff…

高中数学两面角习题练习1

用到的定理 2 第1问证明&#xff1a; 第2问用到的知识和例子&#xff1a; 二面角锐角钝角判断的快速技巧 https://www.bilibili.com/video/BV13P41157K1/?spm_id_from333.788.recommend_more_video.0&vd_source91b03ee59c462b7b3cfbd57346cf1001 叉乘的几何意义及应用 …

day39 不同路径 不同路径Ⅱ

题目1&#xff1a;62 不同路径 题目链接&#xff1a;62 不同路径 题意 机器人位于m*n网格的左上角每次只能向下或向右移动一步&#xff0c;到达网格的右下角,返回不同路径的数量 动态规划 动规五部曲 1&#xff09;dp数组及下标i的含义 dp[i][j]&#xff1a;到达(i,j)有…

2024年 复习 HTML5+CSS3+移动web 笔记 之CSS遍 第5天

第 五 天 整个网站例 5.1 准备工作 项目目录与版心 base.css 5.2 网页制作思路 5.3 header 区域-整体布局 5.4 header区域-logo 5.5 header区域-导航 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">&l…

代码随想录算法训练营29期Day41|LeetCode 343,96

文档讲解&#xff1a;整数拆分 不同的二叉搜索树 343.整数拆分 题目链接&#xff1a;https://leetcode.cn/problems/integer-break/description/ 思路&#xff1a; 题目要求我们拆分n&#xff0c;拆成k个数使其乘积和最大&#xff0c;然而题目中并没有给出k&#xff0c;所以…

[python]基于opencv实现的车道线检测

【检测原理】 一、首先进行canny边缘检测&#xff0c;为获取车道线边缘做准备 二、进行ROI提取获取确切的车道线边缘&#xff08;红色线内部&#xff09; 三、利用概率霍夫变换获取直线&#xff0c;并将斜率正数和复数的线段给分割开来 四、离群值过滤&#xff0c;剔除斜率…

uniapp 高德地图显示

1. uniapp 高德地图显示 使用前需到**高德开放平台&#xff08;https://lbs.amap.com/&#xff09;**创建应用并申请Key   登录 高德开放平台&#xff0c;进入“控制台”&#xff0c;如果没有注册账号请先根据页面提示注册账号   打开 “应用管理” -> “我的应用”页面…

Springboot集成Camunda并完成一条流程实例

&#x1f496;专栏简介 ✔️本专栏将从Camunda(卡蒙达) 7中的关键概念到实现中国式工作流相关功能。 ✔️文章中只包含演示核心代码及测试数据&#xff0c;完整代码可查看作者的开源项目snail-camunda ✔️请给snail-camunda 点颗星吧&#x1f618; &#x1f496;设计流程定…

028 方法的重载

方法重载的定义 使用案例 public static void main(String[] args) {// 匹配到max(int a, int b)System.out.println(max(1, 3));// 匹配到max(double a, double b)System.out.println(max(1L, 3L));// 匹配到max(double a, double b, double c, double d)&#xff0c;int自动…

SQL 函数(十二)

SQL 函数&#xff08;十二&#xff09; 一、函数分类 1.1 单行函数 单行函数仅对单个行进行运算&#xff0c;并且每行返回一个结果。 常见的函数类型&#xff1a; 字符、数字、日期、转换 1.2 多行函数 多行函数能够操纵成组的行&#xff0c;每个行组给出一个结果&#x…

【拜年神器】AI写真保姆级教程

1. 介绍 废话不说&#xff0c;先上图看效果 功能简介 上传几张自己的照片&#xff0c;训练之后&#xff0c;就能生成各种风格的AI写真照&#xff0c;主要有无限风格写真、固定模板写真、AI虚拟试衣、人物说话视频四个类别 无限风格写真 固定模板写真 证件照 工作照 婚纱…

k8s中cert-manager管理https证书

前言 目前https是刚需,但证书又很贵,虽然阿里云有免费的,但没有泛域名证书,每有一个子域名就要申请一个证书,有效期1年,1年一到全都的更换,太麻烦了。经过搜索,发现了自动更新证书神器cert-manager;当然cert-manager是基于k8s的。 安装采用Helm方式 Chart地址: ht…

萝卜视频源码前后端带视频演示

萝卜影视源码前端是用JAVA开发的全原生APP源码&#xff0c;后端用的是二次开发的苹果CMS&#xff0c;支持局域网投屏&#xff0c;视频软解硬解&#xff0c;播放器自带弹幕功能。支持解析官方视频&#xff0c;支持M3U8&#xff0c;MP4。 开屏广告&#xff0c;全局广告&#xff0…

lava学习-接口

接口-Interface 1.什么是接口&#xff1f; 例&#xff1a;构造器&#xff0c;代码块在接口中统统没有&#xff0c;也不能创建对象 构造器的使用-----实现类 例&#xff1a;下图中的B类就是一个 实现类 2.接口的好处 继承只能单继承&#xff0c;而接口可以弥补类单继承的不足&am…

iPad“粘贴自”字样不消失解决办法

iPad“粘贴自”字样不消失解决办法 好无语&#xff0c;写论文主要就靠iPad看资料&#xff0c;复制粘帖的时候卡死搞得我无敌焦躁&#xff0c;问了&#x1f34e;支持的客服才解决&#xff0c;方法如下&#xff1a;1.音量上键按一下 2.音量下键按一下 3.一直按开关机键直到出现苹…