怎样快速找出任意一组数列中递增数的位置
比如:a=
递增数的位置应该是 1 2 3 5 6 7
下面是我写的一个函数
function p=posi(a) %找出数列递增项
NN=length(a);
for ii=2:NN
if a(ii)-a(ii-1)>1e-6 %递增
p(ii)=ii;
p(ii-1)=ii-1;
elseif abs(a(ii)-a(ii-1))<1e-6 %相等
p(ii)=0;
p(ii-1)=0;
else
p(ii)=0;
p(ii-1)=0;
end
end
end
用这个算出来的结果: 1 25 6 7
这个会覆盖掉一部分。
另外,这还是用循环算的,效率较低。
求解答。 用diff和find试一试吧 qibbxxt 发表于 2012-1-13 09:28 static/image/common/back.gif
用diff和find试一试吧
diff我也想过,但是diff会少一个数 function p=posi(a) %找出数列递增项
NN=length(a);
for ii=2:NN
if a(ii)-a(ii-1)>1e-6 %递增
p(ii)=ii;
p(ii-1)=ii-1;
elseif abs(a(ii)-a(ii-1))<1e-6 %相等
p(ii)=0;
else
p(ii)=0;
end
end
end不用循环还是不会。。 sigma665 发表于 2012-1-14 13:54 static/image/common/back.gif
不用循环还是不会。。
indmax=find(diff(sign(diff(a)))<0)+1;%极大值点索引坐标
indmin=find(diff(sign(diff(a)))>0)+1;%极小值点索引坐标
求出来后每个极小值到极大值索引之间就是你要的递增索引项。 本帖最后由 qibbxxt 于 2012-1-16 08:59 编辑
sigma665 发表于 2012-1-13 15:54 static/image/common/back.gif
diff我也想过,但是diff会少一个数按照吴兄的思想,来实现:
a = ;
b =find(bitor(imregionalmin(a),imregionalmax(a)));
c = arrayfun(@(x)b(x):b(x + 1),1:2:length(b),'uni',0);
celldisp(c);
c{1} =
1 2 3
c{2} =
4 5 6 本帖最后由 bainhome 于 2012-1-16 11:29 编辑
bitor,imregionalmin,imregionalmax这些命令比较奇怪,从来没用过。
但这段命令的计算结果似乎算的是递减数列,例如下面这段代码:clc
clear
data=round(100*rand(1,15))
b =find(bitor(imregionalmin(data),imregionalmax(data)))
c = arrayfun(@(x) b(x):b(x + 1),1:2:length(b),'uni',0);
celldisp(c);data =
49 44 45 31 51 51 82 79 64 38 81 53 35 94 88
b =
1 2 3 4 7 10 11 13 14 15
c{1} =
1 2
c{2} =
3 4
c{3} =
7 8 9 10
c{4} =
11 12 13
c{5} =
14 15另外向量长度变大后,会出现错误:??? Attempted to access b(18); index out of bounds because numel(b)=17.
Error in ==> @(x)b(x):b(x+1)
Error in ==> celldispxxxxx at 18
c = arrayfun(@(x) b(x):b(x + 1),1:2:length(b),'uni',0);取极值之间数据计算结果需要考虑极大值、极小值序列索引首个序号大小不同的情况。 bainhome 发表于 2012-1-16 11:27 static/image/common/back.gif
bitor,imregionalmin,imregionalmax这些命令比较奇怪,从来没用过。
但这段命令的计算结果似乎算的是递减数 ...
恩,谢谢老兄提出,的确有这些问题,我改进一下clear;clc;close all
a = ;
bmin = find(imregionalmin(a));
bmax = find(imregionalmax(a));
c = cell2mat(arrayfun(@(x)find(bmax > x,1),bmin,'uni',0));
d = arrayfun(@(x)bmin(x):bmax(c(x)),1:length(c),'uni',0);
celldisp(d); 问题是解决了,不过这个程序看不太懂啊。。
比如c的作用是什么???
页:
[1]