Matlab 矩阵在出现最大值之前获取矩阵的最小值

Matlab 矩阵在出现最大值之前获取矩阵的最小值,matlab,max,min,Matlab,Max,Min,我试图在矩阵的最大值出现之前得到矩阵的最小值。我有两个矩阵:矩阵数据和矩阵a。矩阵a是矩阵数据的子集,由矩阵数据的最大值组成。我有以下代码,但显然做了一些错误 edit: 矩阵a是矩阵数据的最大值。我从以下方面得出: for x=1:size(data,1) a(x)=max(data(x,:)); end a=a' clear x 矩阵b代码: for x=1:size(data,1) b(x)=min(data(x,(x<data==a))); end b=b' clear x

我试图在矩阵的最大值出现之前得到矩阵的最小值。我有两个矩阵:矩阵数据和矩阵a。矩阵a是矩阵数据的子集,由矩阵数据的最大值组成。我有以下代码,但显然做了一些错误

edit:
矩阵a是矩阵数据的最大值。我从以下方面得出:

for x=1:size(data,1)
a(x)=max(data(x,:));
end
a=a'
clear x 
矩阵b代码:

for x=1:size(data,1)
b(x)=min(data(x,(x<data==a)));
end
b=b'
clear x

matrix data   matrix a   matrix b
1  2   3  4      4        1
6  5   4  7      7        4
9  6  12  5     12        6
x=1时的
:大小(数据,1)

b(x)=min(data(x),(x这并不漂亮,但这是迄今为止我发现的唯一一种没有循环的方法

如果循环正常,我推荐Gunther Struyf answer作为matlab内置数组循环函数的最简洁的用法,
arrayfun

如果您想要的是列分钟而不是行分钟,那么一些换位等可能是多余的

[mx, imx] = max(data');
inds = repmat(1:size(data,2), [size(data,1),1]);
imx2 = repmat(imx', [1, size(data,2)]);
data2 = data;
data2(inds >= imx2) = inf;
min(data2');
注意:如果不需要数据,我们可以删除额外的
data2
变量,并减少行数

为了证明这一点,(看看我是否正确理解了这个问题):

输入

>> data = [1,3,-1; 5,2,1]
我得到最小值:

>> min(data2')
ans = [1, inf]
也就是说,它只在每行的最大值之前找到最小值,其他任何值都设置为
inf

简言之:

  • 对于每一行,获取最大值的索引
  • 生成列索引矩阵
  • 使用
    repmat
    生成与数据大小相同的矩阵,其中每行都是最大值的索引
  • 将数据设置为无穷大,其中列索引>最大索引矩阵
  • 像往常一样找到敏
简洁明了:

[a,idxmax] = max(data,[],2);
b = arrayfun(@(ii) min(data(ii,1:idxmax(ii))), 1:size(data,1));
这和

b=NaN(1,size(data,1)); % preallocation!
for ii=1:size(data,1)
    b(ii) = min(data(ii,1:idxmax(ii)));
end
忽略最大值本身 如果您希望之前所有内容的最小值(不包括最大值),则最大值可能是第一个数字,您可以尝试取空矩阵的最小值。然后,解决方案是使用单元格输出,该输出可以为空:

b = arrayfun(@(ii) min(data(ii,1:idxmax(ii)-1)), 1:size(data,1),'uni',false);
用NaN替换空单元格 如果要将空单元格替换为Nan,然后再返回矩阵,请使用以下命令:

b(cellfun(@isempty,b))={NaN};
b=cell2mat(b);
或者只需使用早期版本,当其等于
a(ii)
时,将
b(ii)
替换为
NaN

b = arrayfun(@(ii) min(data(ii,1:idxmax(ii))), 1:size(data,1));
b(b'==a) = NaN
例子: 产出:

a' = 16    11    12    15

b =
    16     5     6     4

对于第二个解决方案,使用单元格输出并忽略最大值本身



顺便说一句: 可以替换为

a=max(data,[],2);

您是如何获得
Max
数据的?它是否正确?您能否详细说明问题所在?您是否没有获得正确的最小值,或者代码中是否存在实际错误?最好为变量使用其他名称,而不是内置函数的名称,即使大小写不同……您想要什么?可以吗你给出一个例子?例如,
data=[1 3 5 4 2 0]
-->
a=5
,然后你想要最小的子集
[1 3 5]
?使用matlabs内置的矩阵for loop肯定是最短的答案,
arrayfun
-很好。我尝试了完整的矩阵路径,但代码可读性较差。关于首先出现的最大值,为什么输出必须是一个单元格?它可以替换为NaN或0吗?使用for循环,是的,但您必须使用if/then/else元素过滤掉它,不要直接使用arrayfun,因为它想要用相同的维度吐出东西;并且
0x1!=1x1
我将编辑以追加this@GuntherStruyf你能解释一下这个索引吗:[a,idxmax]=max(数据,[],2)@BernardUntalanJr.;中描述下的第6行您也可以使用
bsxfun(@ge,1:size(data,1),imx')生成索引矩阵
inds>=imx2
这不是另一个伪装的matlab循环函数吗?是的,但是很快,无论如何都比repmat快。也很容易,因为你不必预先分配,也不必让索引在你的code@mutzmatron.谢谢底部的解释。我是编程新手,不明白程序是如何运行的。@mutzmatron,更多信息请参见:;)
b =[1x0 double]    [5]    [6]    [4]
for x=1:size(data,1)
    a(x)=max(data(x,:));
end
a=a'
clear x
a=max(data,[],2);