我如何在matlab中实现精英主义?例如,我运行一个程序,每次运行后,一个值保存在一个变量中,并且在完成所有运行之后,比如6次运行,我有a
如下
a = [7, 5, 4, 3, 6, 8];
如何在a
上应用精英主义,以使a
的内容为a = [7, 5, 4, 3, 3, 3];
那是当我扫描a
时,我将用我遇到的小号替换更大的号码。从示例中,经过a
,5<7
扫描后,我保持5
,4<5
,所以我保留4
,3<4
,所以我保留3
,3<6
,因此我将6
替换为3
,然后再替换3< 8
,因此我将8
替换为3
} {结束a
为a = [7, 5, 4, 3, 3, 3];
你如何在Matlab中做到这一点。
尝试
我说,
if a(i)< a(i+1)
a(i+1) = a(i);
end
plot(a);
这样我就可以有一个平滑的图表。
但我一直有以下错误:
'Subscript indices must either be real positive integers or logicals.'
知道如何正确地做到这一点。
答案 0 :(得分:4)
我相信这应该适用于所有情况:
b = [a(1), arrayfun(@(n) min(a(1:n)), 2:length(a))]
a =
7 4 3 6 5 2 5
b =
7 4 3 3 3 2 2
有关信息:
您最初的想法是正确的,但您忘记将if
放入循环中。你可以做到:
for ii = 1:length(a)-1
if a(ii)< a(ii+1)
a(ii+1) = a(ii);
end
end
您收到错误的原因是您可能没有定义i
,因此MATLAB将其解释为虚构单元(sqrt(-1)
)。这也是我在循环中使用ii
而不是i
的原因,以避免此类错误。
答案 1 :(得分:2)
已编辑以使用本地最低标准:
a = [7, 5, 4, 3, 6, 8];
[y, i] = findpeaks(-a, 'npeaks', 1) ;
a(i:end)=-y;
plot(a)
情节:
答案 2 :(得分:2)
Robert P.'s answer的替代arrayfun
:
min(triu(repmat(a(:),1,numel(a))) + tril(NaN(numel(a)),-1))