1

我试图在矩阵的最大值出现之前获取矩阵的最小值。我有两个矩阵:矩阵数据和矩阵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 之前出现的所有最小值

4

2 回答 2

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生成矩阵,与数据大小相同,其中每行是最大索引
  • 将数据设置为无穷大,其中列索引 > max_index 矩阵
  • 像往常一样找到最小值。
于 2012-08-02T14:05:44.923 回答
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)替换为:NaNa(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);
于 2012-08-02T14:09:32.207 回答