022_matrix_dancing_in_Matlab中求解一个超简单的矩阵问题

在这里插入图片描述

矩阵体操

首先,可以复习一下向量、矩阵和索引的基础知识。

  • 向量约定
  • 矩阵约定
  • 矩阵索引

一般而言,我们利用进行计算大概就是以下的步骤:

构造矩阵
操作矩阵
访问矩阵

基本上,这个状态图描述了我们大部分时候利用Matlab来构造一个运算的过程。

矩阵定义

矩阵定义的两个基本元素是:类型和大小。

通过zerosoneseyerand等函数可以定义不同性质的矩阵。

操作矩阵

通过+-*/等运算符可以对矩阵进行操作。也可以通过.*./.^等运算符对矩阵进行逐元素操作。

当我们把矩阵作为左值进行赋值,就可以改变部分元素的值。

从索引的角度来看,我们可以通过:end两个符号来访问矩阵的部分元素就;逻辑索引也非常强大,对部分满足条件的元素进行赋值。

此外,矩阵还能通过各种函数进行过变换、组合。

访问矩阵

最终,通过矩阵索引我们可以访问矩阵的元素作为计算结果,或者输出在终端,或者绘制成图像。

例子

这个例子简直是……斯文丧尽,算了,就这个例子吧。

在这里插入图片描述

构造矩阵

那么首先,我们构造一个函数来生成这个矩阵:

function m = sumMatrix(varargin)
% 产生一个特殊2维矩阵
%   其中矩阵的元素为,矩阵下标的和减去一
%   1 2 3 4 5 6 ...
%   2 3 4 5 6 7 ...
%   3 4 5 6 7 8 ...
%   4 5 6 7 8 9 ...
%   5 6 7 8 9 ...
%   6 7 8 9 ...

%  函数调用的参数,参考`zeros`, `ones`

m = zeros(varargin{:});
sz = size(m(1:2));

for i = 1:numel(m)
    [row, col] = ind2sub(sz, i);
    m(row, col) = row + col - 1;
end

这个函数的输入的参数和zerosones等函数一样。

我们从zeros函数生成一个矩阵, 然后遍历矩阵的元素(numel计算其元素个数),对每个元素,通过ind2sub函数来计算矩阵的下标,然后计算矩阵的元素的值。

m i j = i + j − 1 , i = 1 , 2 , … , n 1 , j = 1 , 2 , … , n 2 m_{ij} = i + j - 1, \quad i = 1, 2, \ldots, n_1, \quad j = 1, 2, \ldots, n_2 mij=i+j1,i=1,2,,n1,j=1,2,,n2

这是一个非常经典的Matlab遍历矩阵元素的方式。

操作矩阵

接下来是第二部,保留矩阵左上角的元素,其他元素置为0。

function mNew = leftUpper(m)
arguments
    m (:, :)
end

mNew = m;
sz = size(m);
n = numel(m);
for i = 1:n
    [row, col] = ind2sub(sz, i);

    % top-right
    if col + row > sz(end) + 1 
    % if col + row > size(1) + 1  % left-bottom
        mNew(row, col) = 0;
    end
end

此处增加了一点点新的东西,就是arguments关键字,用来指定输入参数的类型。

同样,我们命名一个新的矩阵mNew,然后遍历原矩阵的元素,如果元素的下标的和大于矩阵对角线下标和,就把这个元素置为0。

这里有一个很好玩的地方,就是在Matlab中,当我们使用mNew = m;来定义一个新的矩阵时,并没有内存的拷贝发生,而是两个变量指向了同一个内存地址。

但是,当我们对mNew进行赋值时,Matlab会自动为mNew分配新的内存空间,这样就不会影响到m的值。这个策略叫copy-on-write。当然,我也不知道知道这个有什么用……

访问矩阵

最后一步,提取矩阵中感兴趣的函数,这里我们需要的是提取左上角 3 × 3 3\times 3 3×3 的矩阵。

function mSub = subMatrix(m, row, col)
% 返回矩阵的上左部分,由参数`row`和`col`指定行数和列数

arguments
    m (:, :) 
    row (1,1) {mustBeInteger, mustBePositive, mustBeInSize(row, m, 1)}
    col (1,1) {mustBeInteger, mustBePositive, mustBeInSize(col, m, 2)} 
end

mSub = m(1:row, 1:col);

function mustBeInSize(idx, matrix, dim)
if idx > size(matrix, dim)
    eid = 'Size:outsize';
    msg = sprintf("Index (%d) must be less or equal to last index (%d) in given dimesion (%d)", idx, size(matrix, dim), dim);
    throwAsCaller(MException(eid, msg));
end

你要问这个为什么要搞这么复杂……我肯定不会回答你的。

这里对于函数的参数,有了更加复杂的检查。我们使用arguments关键字来指定输入参数的类型,然后使用mustBeIntegermustBePositive等函数来检查输入参数的合法性。

甚至,这里我们定义了一个内部函数mustBeInSize,用来检查输入参数的合法性,这个函数的输入参数是idxmatrixdim,分别是索引、矩阵和维度。确保给的行数和列数小于或等于矩阵对应维的长度。

测试

>> T1 = sumMatrix(4, 4)

T1 =

     1     2     3     4
     2     3     4     5
     3     4     5     6
     4     5     6     7

>> T2 = leftUpper(T1)

T2 =

     1     2     3     4
     2     3     4     0
     3     4     0     0
     4     0     0     0

>> T3 = subMatrix(T2, 3, 3)

T3 =

     1     2     3
     2     3     4
     3     4     0

好吧,这个也太无聊了……

总结

  1. 矩阵的构造、操作和访问是Matlab的基本操作,也是每次计算的核心流程。
  2. 通过zerosoneseyerand等函数可以定义不同性质的矩阵。
  3. 通过+-*/等运算符可以对矩阵进行操作。也可以通过.*./.^等运算符对矩阵进行逐元素操作。
  4. 通过:end两个符号来访问矩阵的部分元素就;逻辑索引也非常强大,对部分满足条件的元素进行赋值。
  5. 通过arguments关键字可以指定输入参数的类型,通过mustBeIntegermustBePositive等函数来检查输入参数的合法性。
  6. 通过copy-on-write策略,Matlab可以减少内存的使用。
  7. 验证函数的输入参数的合法性,可以提高程序的稳定性。

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

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

相关文章

Webserver(2)GCC

目录 安装GCCVScode远程连接到虚拟机编写代码gcc编译过程gcc与g的区别Xftp连接虚拟机上传文件 安装GCC sudo apt install gcc g查看版本是7.5 touch test.c创建代码 但是在虚拟机中写代码很不方便 VScode远程连接到虚拟机编写代码 gcc test.c -o app在虚拟机中用gcc编译的…

世界肺癌日:新药涌现:不断拓展治疗边界

肺癌,这一全球性的健康杀手,每分钟都无情地夺去超过三人的生命,每年导致约180万人不幸离世,占据了全球癌症死亡人数的18%,成为癌症死亡的首要原因。患者不仅要承受生理上的巨大痛苦,还要面对心理上的沉重压…

OpenCV高级图形用户界面(20)更改窗口的标题函数setWindowTitle()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在OpenCV中,cv::setWindowTitle函数用于更改窗口的标题。这使得您可以在程序运行时动态地更改窗口的标题文本。 函数原型 void cv::…

外包干了2年,技术原地踏步。。。。。

先说一下自己的情况,本科生,19年通过校招进入南京某软件公司,干了接近2年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了2年的功能测试&…

一文掌握Kubernates核心组件,构建智能容器管理集群

1.Kubernates简要概述 Kubernates(常称为K8s,因省略了“ubernate”中的8个字符)是Google开源的容器编排平台,专为简化和自动化应用服务的部署、扩展和管理而设计。它将应用与底层的服务器抽象开来,提供了自动化的机制…

修改huggingface的缓存目录以及镜像源

执行以下语句查看当前配置 huggingface-cli env默认输出应该如下 (py39-transformers) PS D:\py_project\transformers_demo> huggingface-cli envCopy-and-paste the text below in your GitHub issue.- huggingface_hub version: 0.26.1 - Platform: Windows-10-10.0.22…

LeetCode课程表打卡(拓扑排序例题)

例题一:LeetCode :207 你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] [ai, bi] ,表示如果要学…

算法速刷(LeetCode)(160.相交链表)

个人思路: 笨蛋做法,但是好用 代码如下 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) {* val x;* next null;* }* }*/ public class Solution …

微信小程序文字转语音播报案例

插件申请 在小程序官方申请同声传译插件,地址: mp.weixin.qq.com 引入插件 在app.json中加入 "plugins": {"WechatSI": {"version": "0.3.6","provider": "wx069ba97219f66d99"}},封装…

Vue入门示例

今天滴学习目标!!! 示例简介HTML内容主体区域输入框列表区域统计和清空 JS引入Vue.js库定义Vue实例el选项data选项methods选项 示例简介 HTML内容 本次实例讲解的是v-for、v-on、v-model来写这小小的实例,下面是实例的效果图&am…

springboot小区物业报修管理系统-计算机设计毕业源码03418

摘 要 本课题的研究对象是小区物业报修管理系统app的设计与实现,该系统实现了用户管理、业主信息管理、报修信息管理、维修记录管理、通知公告管理等功能。本系统在设计上,考虑到系统内容以及系统的受众群体,在系统的美工方面采用了比较正规的…

【JavaEE】【多线程】单例模式

目录 一、设计模式1.1 单例模式1.1.1 饿汉模式1.1.2 懒汉模式 1.2 线程安全问题1.3 懒汉模式线程安全问题的解决方法1.3.1 原子性问题解决1.3.2 解决效率问题1.3.3 解决内存可见性问题和指令重排序问题 一、设计模式 在讲解案例前,先介绍一个概念设计模式&#xff…

【开源免费】基于SpringBoot+Vue.JS母婴商城系统 (JAVA毕业设计)

本文项目编号 T 030 ,文末自助获取源码 \color{red}{T030,文末自助获取源码} T030,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

力扣 简单 111.二叉树的最小深度

文章目录 题目介绍题解 题目介绍 题解 最小深度:从根节点到最近叶子结点的最短路径上节点数量。 分三种情况讨论即可: 当前节点为空,则返回当前节点minDepth0;当前节点左右子树都存在,则返回当前节点minDepth 左右子…

【Unity踩坑】如何关闭项目中的Version Control (Plastic SCM)

Unity官方提供了版本控制Version Control(即原来的Plastic SCM),虽然方便,但是在不同的电脑上同步时,会出现项目不一致的问题。因为只是少数几个人使用,那还不如直接使用Git或SVN来管理。 而且最近发现有一个bug还与P…

Docker 部署 EMQX 一分钟极速部署

部署 EMQX ( Docker ) [Step 1] : 拉取 EMQX 镜像 docker pull emqx/emqx:latest[Step 2] : 创建目录 ➡️ 创建容器 ➡️ 拷贝文件 ➡️ 授权文件 ➡️ 删除容器 # 创建目录 mkdir -p /data/emqx/{etc,data,log}# 创建容器 docker run -d --name emqx -p 1883:1883 -p 1808…

RBM(HA透明主备直路由)

1. 组网需求 如图1-23所示,某公司以Device作为网络边界安全防护设备,连接公司内部网络和Internet,Device的上、下行业务接口均为二层接口。为提高业务稳定性,使用两台Device进行HA组网,Device A作为主设备&#xff0c…

CSS3 动画相关属性实例大全(三)(columns、filter、flex、flex-basis 、flex-grow、flex-shrink属性)

CSS3 动画相关属性实例大全(三) (columns、filter、flex、flex-basis 、flex-grow、flex-shrink属性) 本文目录: 一、columns属性(设置元素的列宽和列数) 二、filter属性(调整图像、背景和边…

C++第八讲:STL--stack和queue的使用及模拟实现

C第八讲:STL--stack和queue的使用及模拟实现 1.stack的使用2.queue的使用3.栈和队列OJ题3.1题目1:最小栈3.2题目2:栈的压入、弹出序列3.3题目3:逆波兰表达式求值3.4题目4:用栈实现队列 4.栈的模拟实现5.队列的模拟实现…

某大型液压企业干部职业化项目纪实

某大型液压企业干部职业化项目纪实 ——引入三级职能分解,监督检查标准化 【导读】 企业逐渐发展,人员规模逐渐扩大的同时,中层管理者的数量也大幅增加,但是,管理人员增加了,管理问题却越来越多。公司很…