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

目录

  • 一、问题描述
    • [1.1 max函数用法](#1.1 max函数用法)
    • [1.2 MATLAB中 : : :的作用](#1.2 MATLAB中 : : :的作用)
    • [1.3 ind2sub函数用法](#1.3 ind2sub函数用法)
  • 二、实现方法
    • [2.1 方法一:max和find](#2.1 方法一:max和find)
    • [2.2 方法二:max和ind2sub](#2.2 方法二:max和ind2sub)
    • [2.3 方法对比](#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查找矩阵最大(小)值,并找到所在位置

相关推荐
朝朝辞暮i1 小时前
C++ 第 31C 课:Subscriber 到底是什么
开发语言·c++·算法
Evand J2 小时前
【MATLAB例程】三维RRT+APF路径规划与AOA-TDOA融合定位算法。附代码的下载链接
算法·matlab·路径规划·rrt·tdoa·apf·aoa
海绵宝宝转agent2 小时前
leetCode100算法开源笔记分享
笔记·算法
写后端的胖头鱼3 小时前
时间复杂度 & 空间复杂度
java·数据结构·算法·时间复杂度·空间复杂度
hahaha60163 小时前
黑体轨迹和色温--光源白点
人工智能·嵌入式硬件·算法·计算机视觉
海绵宝宝转agent3 小时前
基于Redis ZSet+AOP+注解实现限流注解算法
数据库·redis·算法
All for pursuit.4 小时前
【回溯-7】494.目标和
数据结构·c++·算法·leetcode
白杨尚青4 小时前
C++入门篇(十三):vector(上)——动态数组:构造、空间增长与迭代器失效
开发语言·c++·笔记·算法·stl
Jasmine_llq4 小时前
《P17461 [GESP202609 八级] 生成树计数》
算法·栈·tarjan 算法·边双连通分量·深度优先搜索 dfs·tarjan 保存当前路径节点·模乘法
Jasmine_llq4 小时前
《P17462 [GESP202609 八级] 末班车》
算法·dijkstra 算法·最大化版本,求最长可行值·建反向图(逆图 / 反转边)·多源 dijkstra 思想·对每个终点单独跑一遍djst·离线预处理 + 在线查询