找回密码
 注册
Simdroid-非首页
查看: 128|回复: 8

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

[复制链接]
发表于 2012-1-12 16:54:29 | 显示全部楼层 |阅读模式 来自 江苏南京
比如:
a=[1 2 3 2 1 2 3]
递增数的位置应该是 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 2  5 6 7
这个会覆盖掉一部分。

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

求解答。
发表于 2012-1-13 09:28:17 | 显示全部楼层 来自 河北廊坊
Simdroid开发平台
用diff和find试一试吧
回复 不支持

使用道具 举报

 楼主| 发表于 2012-1-13 15:54:16 | 显示全部楼层 来自 江苏南京
qibbxxt 发表于 2012-1-13 09:28
用diff和find试一试吧

diff我也想过,但是diff会少一个数
回复 不支持

使用道具 举报

 楼主| 发表于 2012-1-14 13:54:31 | 显示全部楼层 来自 江苏南京
  1. function p=posi(a) %找出数列递增项
  2.         NN=length(a);
  3.         for ii=2:NN
  4.             if a(ii)-a(ii-1)>1e-6 %递增
  5.                 p(ii)=ii;
  6.                 p(ii-1)=ii-1;
  7.             elseif abs(a(ii)-a(ii-1))<1e-6 %相等
  8.                 p(ii)=0;               
  9.             else
  10.                 p(ii)=0;                        
  11.             end         
  12.         end        
  13.     end
复制代码
不用循环还是不会。。
回复 不支持

使用道具 举报

发表于 2012-1-15 00:09:22 | 显示全部楼层 来自 江苏
sigma665 发表于 2012-1-14 13:54
不用循环还是不会。。

indmax=find(diff(sign(diff(a)))<0)+1;%极大值点索引坐标
indmin=find(diff(sign(diff(a)))>0)+1;%极小值点索引坐标
求出来后每个极小值到极大值索引之间就是你要的递增索引项。

评分

2

查看全部评分

回复 不支持

使用道具 举报

发表于 2012-1-16 08:59:02 | 显示全部楼层 来自 河北廊坊
本帖最后由 qibbxxt 于 2012-1-16 08:59 编辑
sigma665 发表于 2012-1-13 15:54
diff我也想过,但是diff会少一个数
按照吴兄的思想,来实现:
  1. a = [1 2 3 1 2 3];
  2. b =find(bitor(imregionalmin(a),imregionalmax(a)));
  3. c = arrayfun(@(x)b(x):b(x + 1),1:2:length(b),'uni',0);
  4. celldisp(c);
复制代码

  1. c{1} =

  2.      1     2     3



  3. c{2} =

  4.      4     5     6
复制代码

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2012-1-16 11:27:01 | 显示全部楼层 来自 新疆乌鲁木齐
本帖最后由 bainhome 于 2012-1-16 11:29 编辑

bitor,imregionalmin,imregionalmax这些命令比较奇怪,从来没用过。
但这段命令的计算结果似乎算的是递减数列,例如下面这段代码:
  1. clc
  2. clear
  3. data=round(100*rand(1,15))
  4. b =find(bitor(imregionalmin(data),imregionalmax(data)))
  5. c = arrayfun(@(x) b(x):b(x + 1),1:2:length(b),'uni',0);
  6. celldisp(c);
复制代码
  1. data =
  2.     49    44    45    31    51    51    82    79    64    38    81    53    35    94    88
  3. b =
  4.      1     2     3     4     7    10    11    13    14    15
  5. c{1} =
  6.      1     2
  7. c{2} =
  8.      3     4
  9. c{3} =
  10.      7     8     9    10
  11. c{4} =
  12.     11    12    13
  13. c{5} =
  14.     14    15
复制代码
另外向量长度变大后,会出现错误:
  1. ??? Attempted to access b(18); index out of bounds because numel(b)=17.

  2. Error in ==> @(x)b(x):b(x+1)


  3. Error in ==> celldispxxxxx at 18
  4. c = arrayfun(@(x) b(x):b(x + 1),1:2:length(b),'uni',0);
复制代码
取极值之间数据计算结果需要考虑极大值、极小值序列索引首个序号大小不同的情况。
回复 不支持

使用道具 举报

发表于 2012-1-16 12:29:31 | 显示全部楼层 来自 河北廊坊
bainhome 发表于 2012-1-16 11:27
bitor,imregionalmin,imregionalmax这些命令比较奇怪,从来没用过。
但这段命令的计算结果似乎算的是递减数 ...

恩,谢谢老兄提出,的确有这些问题,我改进一下
  1. clear;clc;close all
  2. a = [49,44,45,31,51,51,82,79,64,38,81,53,35,94,88];
  3. bmin = find(imregionalmin(a));
  4. bmax = find(imregionalmax(a));
  5. c = cell2mat(arrayfun(@(x)find(bmax > x,1),bmin,'uni',0));
  6. d = arrayfun(@(x)bmin(x):bmax(c(x)),1:length(c),'uni',0);
  7. celldisp(d);
复制代码
回复 不支持

使用道具 举报

 楼主| 发表于 2012-2-16 16:02:12 | 显示全部楼层 来自 江苏南京
问题是解决了,不过这个程序看不太懂啊。。

比如c的作用是什么???
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-7-8 08:39 , Processed in 0.051038 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表