|
| 1 | +%[text] 返回数组的最大值以及所在的坐标。 |
| 2 | +%[text] MATLAB自带的max函数只能返回多维数组最大值的线性索引。本函数一口气返回最大值以及多维坐标,方便易用 |
| 3 | +%[text] ## 语法 |
| 4 | +%[text] ```matlabCodeExample |
| 5 | +%[text] import MATLAB.DataFun.MaxSubs |
| 6 | +%[text] |
| 7 | +%[text] [Value,S1,S2,…,Sn]=MaxSubs(Data); |
| 8 | +%[text] %返回整个多维数组的全局最大值及其坐标 |
| 9 | +%[text] |
| 10 | +%[text] [___]=MaxSubs(Data,Dimensions); |
| 11 | +%[text] %仅在指定维度上取最大值,返回指定维度上的最大值坐标 |
| 12 | +%[text] |
| 13 | +%[text] [___]=MaxSubs(Data,Dimensions,K); |
| 14 | +%[text] %额外指定要返回几个最大值 |
| 15 | +%[text] ``` |
| 16 | +%[text] ## 示例 |
| 17 | +%[text] ```matlabCodeExample |
| 18 | +%[text] %对于有多个最大值的数组,返回线性索引最小的那个位置的坐标: |
| 19 | +%[text] [M,S1,S2]=MATLAB.DataFun.MaxSubs([9 9 1;1 4 4;9 8 9]) |
| 20 | +%[text] %{ |
| 21 | +%[text] M = |
| 22 | +%[text] |
| 23 | +%[text] 9 |
| 24 | +%[text] |
| 25 | +%[text] |
| 26 | +%[text] S1 = |
| 27 | +%[text] |
| 28 | +%[text] 1 |
| 29 | +%[text] |
| 30 | +%[text] |
| 31 | +%[text] S2 = |
| 32 | +%[text] |
| 33 | +%[text] 1 |
| 34 | +%[text] %} |
| 35 | +%[text] %还可以指定运算维度。如将一个3维数组的后两维求最大值和下标,则返回的最大值和下标都是沿第1维的向量,且只返回最大值在后两维的下标 |
| 36 | +%[text] [M,S2,S3]=MATLAB.DataFun.MaxSubs(rand(3,3,3),[2 3]) |
| 37 | +%[text] %坐标维度输出顺序与输入的指定Dimension有关 |
| 38 | +%[text] [M,S3,S2]=MATLAB.DataFun.MaxSubs(rand(3,3,3),[3 2]) |
| 39 | +%[text] ``` |
| 40 | +%[text] ## 输入参数 |
| 41 | +%[text] Data,要寻找最大值的多维数组。 |
| 42 | +%[text] Dimensions(1,:)=\[\],要取最大值的维度。如果设为空,将把所有维度都参与运算,即返回单一标量作为整个数组的最大值,并按顺序返回该最大值各个维度的坐标。 |
| 43 | +%[text] K=1,要取几个最大值。 |
| 44 | +%[text] ## 返回值 |
| 45 | +%[text] Value,最大值。在Dimensions(1)指定的维度上(如果Dimensions为空,则在第1维度上)长度为K,在Dimensions(2:end)指定的维度上(如果Dimensions为空,则在2:ndims(Data)维度上)长度为1,在其它维度上长度与Data相同。 |
| 46 | +%[text] S1,S2, …, Sn,最大值所在的位置中,线性索引最小的那个位置的坐标。每个返回值依次代表各维度的坐标。如果指定了Dimensions不为空,将只包含Dimensions维度的坐标`,并按照Dimensions指定的顺序排列输出。这些坐标值数组的尺寸与Value相同,一一对应。` |
| 47 | +%[text] **See also** [max](<matlab:doc max>) [maxk](<matlab:doc maxk>) |
| 48 | +function [Value,varargout] = MaxSubs(Data,Dimensions,K) |
| 49 | +arguments |
| 50 | + Data |
| 51 | + Dimensions(1,:)=[] |
| 52 | + K=1 |
| 53 | +end |
| 54 | +NumDimensions=numel(Dimensions); |
| 55 | +if nargout>1 |
| 56 | + if K>1 |
| 57 | + switch NumDimensions |
| 58 | + case 0 |
| 59 | + [Value,LinearIndex]=maxk(Data(:),K); |
| 60 | + [varargout{1:max(nargout-1,ndims(Data))}]=ind2sub(size(Data),LinearIndex); |
| 61 | + case 1 |
| 62 | + [Value,varargout{1}]=maxk(Data,K,Dimensions); |
| 63 | + otherwise |
| 64 | + OtherDimensions=setdiff(1:max([Dimensions,ndims(Data)]),Dimensions); |
| 65 | + Permuter=[Dimensions,OtherDimensions]; |
| 66 | + DimensionsSize=size(Data,Dimensions); |
| 67 | + [Value,LinearIndex]=maxk(reshape(permute(Data,Permuter),[prod(DimensionsSize),ones(1,NumDimensions-1),size(Data,OtherDimensions)]),K,1); |
| 68 | + Value=ipermute(Value,Permuter); |
| 69 | + [varargout{1:NumDimensions}]=ind2sub(DimensionsSize,ipermute(LinearIndex,Permuter)); |
| 70 | + end |
| 71 | + else |
| 72 | + switch NumDimensions |
| 73 | + case 0 |
| 74 | + [Value,LinearIndex]=max(Data(:)); |
| 75 | + [varargout{1:max(nargout-1,ndims(Data))}]=ind2sub(size(Data),LinearIndex); |
| 76 | + case 1 |
| 77 | + [Value,varargout{1}]=max(Data,[],Dimensions); |
| 78 | + otherwise |
| 79 | + %必需ndims,不能用nargout,否则ind2sub会把后面维度都乘起来 |
| 80 | + DimIndex=1:max([ndims(Data),Dimensions]); |
| 81 | + |
| 82 | + [Value,LinearIndex]=max(Data,[],Dimensions,'linear'); |
| 83 | + %max的linear是全局线性坐标,而不是指定维度上的线性坐标 |
| 84 | + |
| 85 | + [varargout{DimIndex}]=ind2sub(size(Data,DimIndex),LinearIndex); |
| 86 | + varargout=varargout(Dimensions); |
| 87 | + end |
| 88 | + end |
| 89 | +elseif K>1 |
| 90 | + switch NumDimensions |
| 91 | + case 0 |
| 92 | + Value=maxk(Data(:),K); |
| 93 | + case 1 |
| 94 | + Value=maxk(Data,K,Dimensions); |
| 95 | + otherwise |
| 96 | + OtherDimensions=setdiff(1:max([Dimensions,ndims(Data)]),Dimensions); |
| 97 | + Permuter=[Dimensions,OtherDimensions]; |
| 98 | + Value=ipermute(maxk(reshape(permute(Data,Permuter),[prod(size(Data,Dimensions)),ones(1,NumDimensions-1),size(Data,OtherDimensions)]),K,1),Permuter); |
| 99 | + end |
| 100 | +elseif NumDimensions |
| 101 | + Value=max(Data,[],Dimensions); |
| 102 | +else |
| 103 | + Value=max(Data(:)); |
| 104 | +end |
| 105 | + |
| 106 | +%[appendix]{"version":"1.0"} |
| 107 | +%--- |
0 commit comments