目錄
- 一、問題描述
- 1.1 max函數用法
- 1.2 MATLAB中 : : :的作用
- 1.3 ind2sub函數用法
- 二、實現方法
- 2.1 方法一:max和find
- 2.2 方法二:max和ind2sub
- 2.3 方法對比
- 三、參考文獻
一、問題描述
matlab中求最大值可使用函數max,對于一維向量,利用max函數可以直接得到向量中的最大值及其所在位置,但對于矩陣,則需要根據max函數的用法,借助其他函數共同進行處理。
1.1 max函數用法
1.找出向量中的最大值及其位置
A = [8, 1, 6, 9, 3];
[maxVal,Idx] = max(A);
disp(maxVal); % 輸出: 9
disp(Idx); % 輸出: 4
2.找出矩陣中每列的最大值及其位置
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.找出矩陣中每行的最大值及其位置
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。
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中數據是按列優先進行存儲的,線性索引與二維矩陣中行和列的下標有以下關系:
rowIdx = mod(linearIdx,rowLen); % 取余數
colIdx = ceil(linearIdx/rowLen); % 向上取整
disp(['RowIdx: ', num2str(rowIdx), ', ColIdx: ', num2str(colIdx)]);
二、實現方法
2.1 方法一:max和find
- 找到矩陣的最大值:
max_val = max(A( : : :));
這里,A( : : :) 將矩陣轉換為一個列向量,max 函數返回該向量中的最大值。 - 找到最大值的位置:
[row, col] = find(A == max_val);
find 函數返回所有等于最大值的元素的位置。如果矩陣中有多個相同最大值,row 和 col 將包含所有這些位置的索引。 - 獲取第一個出現的最大值的位置(如果有多個相同最大值):
first_row = row(1);
first_col = col(1);
2.2 方法二:max和ind2sub
- 找到最大值及其索引:
[max_val , idx] = max(A( : : :));
max 函數返回最大值及其在展開向量中的索引 idx。 - 將線性索引轉換為行和列索引:
[row, col] = ind2sub(size(A), idx);
ind2sub 函數根據矩陣的大小將線性索引 idx 轉換為對應的行和列索引。
2.3 方法對比
第一種方法可能更直觀,但如果有多個相同最大值的情況,可能會返回多個位置,這時候可能需要額外處理,只取第一個出現的位置。而第二種方法則直接給出了唯一的索引,因為max函數返回的是第一個出現的最大值的位置。
三、參考文獻
[1] MATLAB 求一個矩陣的最大值極其所在位置
[2] matlab 找矩陣中每行或每列的最大值和最小值
[3] matlab查找矩陣最大(小)值,并找到所在位置