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)
argumentsm (:, :)
endmNew = m;
sz = size(m);
n = numel(m);
for i = 1:n[row, col] = ind2sub(sz, i);% top-rightif col + row > sz(end) + 1 % if col + row > size(1) + 1  % left-bottommNew(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`指定行数和列数argumentsm (:, :) row (1,1) {mustBeInteger, mustBePositive, mustBeInSize(row, m, 1)}col (1,1) {mustBeInteger, mustBePositive, mustBeInSize(col, m, 2)} 
endmSub = 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     42     3     4     53     4     5     64     5     6     7>> T2 = leftUpper(T1)T2 =1     2     3     42     3     4     03     4     0     04     0     0     0>> T3 = subMatrix(T2, 3, 3)T3 =1     2     32     3     43     4     0

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

总结

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

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

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

相关文章

MFC实现以不规则PNG图片作为窗口背景

效果图 显示的不规则PNG图片 头文件 #pragma once #include <gdiplus.h> #pragma comment (lib,"Gdiplus.lib")// CShowBack 对话框class CShowBack : public CDialogEx {DECLARE_DYNAMIC(CShowBack) public:CShowBack(CWnd* pParent nullptr); // 标准构…

C++学习路线(二十二)

构造函数 构造函数作用 在创建一个新的对象时&#xff0c;自动调用的函数&#xff0c;用来进行“初始化”工作:对这个对象内部的数据成员进行初始化。 构造函数特点 1.自动调用(在创建新对象时&#xff0c;自动调用) 2.构造函数的函数名&#xff0c;和类名相同 3.构造函数…

react18中的jsx 底层渲染机制相关原理

jsx 底层渲染机制 渲染 jsx 时&#xff0c;会先解析 jsx&#xff0c;生成一个虚拟 dom(virtual dom)。然后将虚拟 dom 渲染成真实 dom。如果 jsx 中包含事件&#xff0c;会将事件绑定到真实 dom 上。 虚拟 dom 对象&#xff0c;是框架内部构建的一套对象体系&#xff0c;对象…

无废话、光速上手 React-Router

React-Router React Router 是一个用于 React 应用的声明式路由库。它允许开发者通过组件化的方式定义应用的路由结构&#xff0c;使得路由管理更加直观和可维护 安装 pnpm i react-router-dom定义路由 定义路由有两种方式&#xff0c;分别是对象路由和路由组件&#xff0c…

AIGC时代 | 从零到一,打造你的专属AI Chat应用!

文章目录 目标功能概要&#xff08;1&#xff09;Chat 交互界面&#xff08;2&#xff09;流式接口&#xff08;3&#xff09;多轮会话&#xff08;4&#xff09;打字效果 系统架构&#xff08;1&#xff09;大模型服务层&#xff08;2&#xff09;应用服务层&#xff08;3&…

深入解析东芝TB62261FTG,步进电机驱动方案

TB62261FTG是一款由东芝推出的两相双极步进电机驱动器&#xff0c;采用了BiCD工艺&#xff0c;能够提供高效的电机控制。这款芯片具有多种优秀的功能&#xff0c;包括PWM斩波、内置电流调节、低导通电阻的MOSFET以及多种步进操作模式&#xff0c;使其非常适合用于需要精确运动控…

微信小程序的日期区间选择组件的封装和使用

组件化开发是一种将大型软件系统分解为更小、更易于管理和复用的独立模块或组件的方法。这种方法在现代软件开发中越来越受到重视&#xff0c;尤其是在前端开发领域。微信小程序的日期区间选择组件的使用 wxml 代码 <view><view bind:tap"chooseData">…

第一个Qt程序

创建项目 进入ui界面拖一个按钮 在头文件中添加函数说明 #ifndef HELLO_H #define HELLO_H#include <QMainWindow>QT_BEGIN_NAMESPACE namespace Ui { class Hello; } QT_END_NAMESPACEclass Hello : public QMainWindow {Q_OBJECTpublic:Hello(QWidget *parent nullpt…

上海亚商投顾:沪指缩量调整 NMN概念股逆势大涨

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 市场全天震荡调整&#xff0c;三大指数午后一度跌超1%&#xff0c;北证50指数则涨超4%&#xff0c;北交所个股…

前端发送请求格式

1.multipart/form-data格式发送请求参数 什么时候用&#xff1a; 当后端API要求以表单的形式接收数据时&#xff0c;比如<input type"text" name"username">和<input type"password" name"password">&#xff0c;这些数据…

html全局属性、框架标签

常用的全局属性&#xff1a; 属性名含义id 给标签指定唯一标识&#xff0c;注意&#xff1a;id是不能重复的。 作用&#xff1a;可以让label标签与表单控件相关联&#xff1b;也可以与css、JavaScript配合使用。 注意&#xff1a;不能再以下HTML元素中使用&#xff1a;<hea…

自动化部署-01-jenkins安装

文章目录 前言一、下载安装二、启动三、问题3.1 jdk版本问题3.2 端口冲突3.3 系统字体配置问题 四、再次启动五、配置jenkins5.1 解锁5.2 安装插件5.3 创建管理员用户5.4 实例配置5.5 开始使用5.6 完成 总结 前言 spingcloud微服务等每次部署到服务器上&#xff0c;都需要本地…

鸿蒙到底是不是纯血?到底能不能走向世界?

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 2016年5月鸿蒙系统开始立项。 2018年美国开始经济战争&#xff0c;其中一项就是制裁华为&#xff0c;不让华为用安卓。 2019年8月9日华为正式发布鸿蒙系统。问题就出在这里&#xff0c;大家可以仔细看。 安卓一…

从零开始学五笔(三):横区字根

从 1 区开始讲解字根&#xff1a; 先介绍按键的区位号、口诀内容、口诀说明然后列每个字根能组成什么汉字&#xff0c;难拆字将用中括号标出 ‍ G 键 区位号&#xff1a;11 口诀&#xff1a;王旁青头戋&#xff08;兼&#xff09;五一 说明&#xff1a; 王旁&#xff1a…

VUE, element-plus, table分页表格列增加下拉筛选多选框,请求后台

简介 为了方便表格查询时可以筛选列的值&#xff0c;需要给列增加筛选框&#xff08;多选框&#xff09;&#xff0c;element-plus提供了列的filter字段&#xff0c;但是基于表格数据的筛选&#xff0c;不会重新请求后台&#xff0c;而且当前表格数据有多少个条目&#xff0c;…

荣耀MagicOS 9.0发布会及开发者大会丨一图读懂应用服务及商业合作分论坛

更多优质流量变现服务&#xff0c;可点击荣耀广告变现服务查看&#xff1b; 荣耀远航计划——应用市场【耀闪行动】全新上线&#xff0c;更多激励及资源扶持可点击荣耀应用市场耀闪行动查看。

香港大学联合上海AI LAB,提出首个人机交互一体化大模型

导读&#xff1a; 具身智能为人与机器人的交互带来了更多便利&#xff0c;利用大语言模型&#xff08;LLMs&#xff09;的推理能力&#xff0c;能够将人类的语言指令逐步转换为机器人可以理解的指令信号。 然而&#xff0c;由于缺乏环境信息作为机器人理解环境和人类指令的上…

FPGA开发verilog语法基础1

文章目录 主体内容1.1 逻辑值1.2 数字进制格式1.3 数据类型1.3.1 寄存器类型1.3.2 线网类型1.3.3 参数类型1.3.4 存储器类型 参考资料 主体内容 1.1 逻辑值 1&#xff0c;逻辑0&#xff0c;表示低电平 2&#xff0c;逻辑1&#xff0c;表示高电平 3&#xff0c;逻辑X&#xff0…

网站安全问题都有哪些,分别详细说明

网站安全问题涉及多个方面&#xff0c;以下是一些常见的网站安全问题及其详细说明&#xff1a; 数据泄露 问题描述&#xff1a;数据泄露是指网站存储的用户敏感信息&#xff08;如用户名、密码、信用卡信息等&#xff09;被非法获取。黑客可能通过SQL注入、XSS攻击等手段窃取这…

学习分布式系统我来助你!【基本知识、基础理论、设计模式、应用场景、工程应用、缓存等全包含!】

基本知识 什么是分布式 分布式系统是一种通过网络连接多个独立计算机节点&#xff0c;共同协作完成任务的系统架构&#xff0c;具有高度的可扩展性、容错性和并发处理能力&#xff0c;广泛应用于大数据处理、云计算、分布式数据库等领域。 通俗来讲&#xff1a;分布式系统就…