sigma665 发表于 2012-1-12 16:54:29

怎样快速找出任意一组数列中递增数的位置

比如:
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
这个会覆盖掉一部分。

另外,这还是用循环算的,效率较低。

求解答。

qibbxxt 发表于 2012-1-13 09:28:17

用diff和find试一试吧

sigma665 发表于 2012-1-13 15:54:16

qibbxxt 发表于 2012-1-13 09:28 static/image/common/back.gif
用diff和find试一试吧

diff我也想过,但是diff会少一个数

sigma665 发表于 2012-1-14 13:54:31

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不用循环还是不会。。

rocwoods 发表于 2012-1-15 00:09:22

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:02

本帖最后由 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:27:01

本帖最后由 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);取极值之间数据计算结果需要考虑极大值、极小值序列索引首个序号大小不同的情况。

qibbxxt 发表于 2012-1-16 12:29:31

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

sigma665 发表于 2012-2-16 16:02:12

问题是解决了,不过这个程序看不太懂啊。。

比如c的作用是什么???
页: [1]
查看完整版本: 怎样快速找出任意一组数列中递增数的位置