利用matlab寻找矩阵中最大值及其位置

ops/2025/2/4 11:47:25/

目录

  • 一、问题描述
  • 二、实现方法
    • 2.1 方法一:max和find
    • 2.2 方法二:max和ind2sub
    • 2.3 方法对比
  • 三、参考文献

一、问题描述

matlab中求最大值可使用函数max,对于一维向量,利用max函数可以直接得到向量中的最大值及其所在位置,但对于矩阵,则需要根据max函数的用法,借助其他函数共同进行处理。

1.1 max函数用法

1.找出向量中的最大值及其位置

matlab">A = [8, 1, 6, 9, 3];
[maxVal,Idx] = max(A);
disp(maxVal);   % 输出: 9
disp(Idx);      % 输出: 4

2.找出矩阵中每列的最大值及其位置

matlab">A = [8, 1, 6; 3, 5, 7; 4, 9, 2];
[maxValCol,IdxCol] = max(A);
%[maxValCol,IdxCol] = max(A,[],1);
disp(maxValCol);    % 输出: [8, 9, 7]
disp(IdxCol);       % 输出: [1, 3, 2]

max(A)默认找出矩阵中每列的最大值,与max(A,[],1)等效。

3.找出矩阵中每行的最大值及其位置

matlab">A = [8, 1, 6; 3, 5, 7; 4, 9, 2];
[maxValRow,IdxRow] = max(A,[],2);
disp(maxValRow);    % 输出: [8, 7, 9]
disp(IdxRow);       % 输出: [1, 3, 2]

1.2 MATLAB中 : : :的作用

对于一个二维矩阵A = [8, 1, 6; 3, 5, 7; 4, 9, 2];利用 : : :可将矩阵转换为一个列向量B = [8;3;4;1;5;9;6;7;2]。

1.3 ind2sub函数用法

ind2sub 函数用于将线性索引转换为多维数组索引。例如将一维向量中某个元素所在的下标转换为其在对应大小数组中的行索引和列索引。
假设有一个向量A,第7个元素为数字8,将其转换到具有4行3列的矩阵B中,利用ind2sub可以获得其在该数组中的行索引为3和列索引为2。

matlab">A = [16;5;9;4;2;11;8;14;3;10;6;15];
B = [16, 2, 3;5,11,10;9,8,6;4,14,15];
[rowLen,colLen] = size(B);
linearIdx = 7;
[rowIdx, colIdx] = ind2sub([rowLen,colLen], linearIdx);
disp(['RowIdx: ', num2str(rowIdx), ', ColIdx: ', num2str(colIdx)]);

ind2sub可以实现该功能的底层原理是,在matlab中数据是按列优先进行存储的,线性索引与二维矩阵中行和列的下标有以下关系:

matlab">rowIdx = mod(linearIdx,rowLen);      % 取余数
colIdx = ceil(linearIdx/rowLen);     % 向上取整
disp(['RowIdx: ', num2str(rowIdx), ', ColIdx: ', num2str(colIdx)]);

二、实现方法

2.1 方法一:max和find

  1. 找到矩阵的最大值:
    max_val = max(A( : : :));
    这里,A( : : :) 将矩阵转换为一个列向量,max 函数返回该向量中的最大值。
  2. 找到最大值的位置:
    [row, col] = find(A == max_val);
    find 函数返回所有等于最大值的元素的位置。如果矩阵中有多个相同最大值,row 和 col 将包含所有这些位置的索引。
  3. 获取第一个出现的最大值的位置(如果有多个相同最大值):
    first_row = row(1);
    first_col = col(1);

2.2 方法二:max和ind2sub

  1. 找到最大值及其索引:
    [max_val , idx] = max(A( : : :));
    max 函数返回最大值及其在展开向量中的索引 idx。
  2. 将线性索引转换为行和列索引:
    [row, col] = ind2sub(size(A), idx);
    ind2sub 函数根据矩阵的大小将线性索引 idx 转换为对应的行和列索引。

2.3 方法对比

第一种方法可能更直观,但如果有多个相同最大值的情况,可能会返回多个位置,这时候可能需要额外处理,只取第一个出现的位置。而第二种方法则直接给出了唯一的索引,因为max函数返回的是第一个出现的最大值的位置。

三、参考文献

[1] MATLAB 求一个矩阵的最大值极其所在位置
[2] matlab矩阵中每行或每列的最大值和最小值
[3] matlab查找矩阵最大(小)值,并找到所在位置


http://www.ppmy.cn/ops/155557.html

相关文章

C++游戏开发实战:从引擎架构到物理碰撞

📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 1. 引言 C 是游戏开发中最受欢迎的编程语言之一,因其高性能、低延迟和强大的底层控制能力,被广泛用于游戏…

【线程】基于环形队列的生产者消费者模型

1 环形队列 环形队列采用数组来模拟,用取模运算来模拟环状特性。 1.如何判断环形队列为空或者为满? 当环形队列为空时,头和尾都指向同一个位置。当环形队列为满时,头和尾也都指向同一个位置。 因此, 可以通过加计数器或者标记…

SSM开发(九) mybatis多表查询(举例说明)

目录 一、背景 二、一对一查询 三、一对多查询 一、背景 用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户 mysql表设计: 二、一对一查询 一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户 实体: @Data public class Order {pr…

Node.js 的底层原理

Node.js 的底层原理 1. 事件驱动和非阻塞 I/O Node.js 基于 Chrome V8 引擎,使用 JavaScript 作为开发语言。它采用事件驱动和非阻塞 I/O 模型,使其轻量且高效。通过 libuv 库实现跨平台的异步 I/O,包括文件操作、网络请求等。 2. 单线程事…

openeuler 22.03 lts sp4 使用 cri-o 和 静态 pod 的方式部署 k8s-v1.32.0 高可用集群

前情提要 整篇文章会非常的长…可以选择性阅读,另外,这篇文章是自己学习使用的,用于生产,还请三思和斟酌 静态 pod 的部署方式和二进制部署的方式是差不多的,区别在于 master 组件的管理方式是 kubectl 还是 systemctl有 kubeadm 工具,为什么还要用静态 pod 的方式部署?…

UE PlayerController、AIController

19. APlayerController 定义和功能 定义:APlayerController是Unreal Engine中用于处理玩家输入并将其转化为游戏世界中的动作的类。它是连接玩家和游戏角色(通常是Pawn)之间的桥梁,负责接收输入并通过Possess方法控制Pawn。 功能…

如何在Windows、Linux和macOS上安装Rust并完成Hello World

如何在Windows、Linux和macOS上安装Rust并完成Hello World 如果你刚刚开始学习Rust,第一步就是安装Rust并运行你的第一个程序!本文将详细介绍如何在Windows、Linux和macOS上安装Rust,并编写一个简单的“Hello, World!”程序。 1. 安装Rust …

【axios二次封装】

axios二次封装 安装封装使用 安装 pnpm add axios封装 // 进行axios二次封装:使用请求与响应拦截器 import axios from axios import { ElMessage } from element-plus//创建axios实例 const request axios.create({baseURL: import.meta.env.VITE_APP_BASE_API,…