我试图在矩阵的最大值出现之前得到矩阵的最小值。我有两个矩阵:矩阵数据和矩阵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之前发生的所有最小值答案 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
生成矩阵,其大小与数据相同,其中每行是最大索引答案 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,然后返回矩阵,请使用:
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);