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

时间:2012-08-02 13:42:43

标签: 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

matrix data   matrix a   matrix b
1  2   3  4      4        1
6  5   4  7      7        4
9  6  12  5     12        6

我需要在矩阵数据

中出现矩阵a之前发生的所有最小值

2 个答案:

答案 0 :(得分:1)

这不是很漂亮,但这是我迄今为止在没有循环的情况下发现这种事情的唯一方法。

如果循环正常,我建议将Gunther Struyf的答案作为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生成矩阵,其大小与数据相同,其中每行是最大索引
  • 将数据设置为无穷大,其中列索引&gt; max_index矩阵
  • 像往常一样找到min。

答案 1 :(得分:1)

简短而简单:

[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);

或仅使用早期版本,并将b(ii)替换为NaN,当它等于a(ii)相同的结果时:

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

实施例

data=magic(4)

    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1

输出:

a' = 16    11    12    15

b =
    16     5     6     4

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);