MATLAB中怎样找出一维向量的急剧变化点? 比如a=[1,2,3,2.5,4,1
来源:学生作业帮 编辑:作业帮 分类:数学作业 时间:2024/07/17 09:23:39
MATLAB中怎样找出一维向量的急剧变化点? 比如a=[1,2,3,2.5,4,1
MATLAB中怎样找出一维向量的急剧变化点?
比如a=[1,2,3,2.5,4,10,13,17,20,23],想在10这个地方断开,并给出10在向量a中的位置,怎么实现?
MATLAB中怎样找出一维向量的急剧变化点?
比如a=[1,2,3,2.5,4,10,13,17,20,23],想在10这个地方断开,并给出10在向量a中的位置,怎么实现?
=abs(diff(a));
[c,d]=max(b);
disp(d(1)+1)
disp(c(1))
再问: 实际上,我这里的向量a不止有一个拐点,给一个更具体的例子吧: a=[1 2 2.5 3.2 5 5.1 5 5.2 5 5.3 5.2 7 11 16 17],这里的a在数值5附近基本保持不变,现在需要找出这个水平段的拐点,有什么比较简单的办法吗?
再答: clearclca=[1 2 2.5 3.2 5 5.1 5 5.2 5 5.3 5.2 7 11 16 17];n=length(a);Ia=1:n;pa=spline(Ia,a);
m=2;% 分成三段Iam0=linspace(1,n,m+2);Iam0=Iam0(2:end-1);
% fmincon 用的约束条件,但是这个函数有警告% A=diag(ones(1,m),-1)+diag(-ones(1,m+1));A(:,end)=[];% b=[-1;zeros(m-1,1);n];
Iam=fminsearch(@(x)sum(abs(interp1([1,x,n],ppval(pa,[1,x,n]),Ia,'linear')-a)),Iam0);%,A,bIam=[1,round(Iam),n];plot(Ia,a,'*')hold onplot(Iam,a(Iam),'-r')
再问: 谢谢啦。我只是想找到离散曲线的两个拐弯点即可,并不需要曲线拟合,你是人为地将a分成了3段了吧?
再问: 谢谢你这么细致地为我指点。我实际上只需要确定出a代表曲线的水平段的起始位置即可。
再答: 对呀,变量Iam(1 x m, m=2)就是两个拐点的下标,以Iam为变量,拐点分开的三段(m+1)直线与曲线的绝对误差和为目标,找到最佳变量,即拐点。根据拐点的多少m也可以取其它整数值。
再问: 谢谢啦,会给你好评啊。我想进一步知道,如果a中有2个甚至更多个水平折线,你这种找水平段的方法还适用不?要是管用的话,这真是一个绝佳办法!
再问: 刚补充的这个问题的关键点是,预先不知道到底有几个水平折线(2个,3个,4个都有可能),只需找到长度最长的那个水平折线即可!
再答: 适合多个的情况,但个数只能人工控制,而且越多,计算复杂度也越高一些。如果只需“找到长度最长的那个水平折线”,这不是最佳方式,试试下面的方法:
clearclc
a=[1 2 2.5 3.2 5 5.1 5 5.2 5 5.3 5.2 7 11 16 17 17+[5.1 5 5.2 5 5.3]];
n=length(a);tol=0.5;% tol 为寻找水平点时,容许的数据误差da=[abs(diff(a))<tol,0];% |差分|j1=0;j2=0;s1=0;s2=0;for i=1:n if da(i)==0 if s2<s1 s2=s1;%s2 最长水平段的数据个数-1 j2=j1;%j2 最长水平段的起始下标 end s1=0;j1=0; else if j1==0 j1=i;%j1 水平段的起始下标 end s1=s1+1;%s1 水平段的数据个数-1 endend
plot(a,'b*')hold onplot(j2:(j2+s2),a(j2:(j2+s2)),'-r')
再问: 谢谢啦!
[c,d]=max(b);
disp(d(1)+1)
disp(c(1))
再问: 实际上,我这里的向量a不止有一个拐点,给一个更具体的例子吧: a=[1 2 2.5 3.2 5 5.1 5 5.2 5 5.3 5.2 7 11 16 17],这里的a在数值5附近基本保持不变,现在需要找出这个水平段的拐点,有什么比较简单的办法吗?
再答: clearclca=[1 2 2.5 3.2 5 5.1 5 5.2 5 5.3 5.2 7 11 16 17];n=length(a);Ia=1:n;pa=spline(Ia,a);
m=2;% 分成三段Iam0=linspace(1,n,m+2);Iam0=Iam0(2:end-1);
% fmincon 用的约束条件,但是这个函数有警告% A=diag(ones(1,m),-1)+diag(-ones(1,m+1));A(:,end)=[];% b=[-1;zeros(m-1,1);n];
Iam=fminsearch(@(x)sum(abs(interp1([1,x,n],ppval(pa,[1,x,n]),Ia,'linear')-a)),Iam0);%,A,bIam=[1,round(Iam),n];plot(Ia,a,'*')hold onplot(Iam,a(Iam),'-r')
再问: 谢谢啦。我只是想找到离散曲线的两个拐弯点即可,并不需要曲线拟合,你是人为地将a分成了3段了吧?
再问: 谢谢你这么细致地为我指点。我实际上只需要确定出a代表曲线的水平段的起始位置即可。
再答: 对呀,变量Iam(1 x m, m=2)就是两个拐点的下标,以Iam为变量,拐点分开的三段(m+1)直线与曲线的绝对误差和为目标,找到最佳变量,即拐点。根据拐点的多少m也可以取其它整数值。
再问: 谢谢啦,会给你好评啊。我想进一步知道,如果a中有2个甚至更多个水平折线,你这种找水平段的方法还适用不?要是管用的话,这真是一个绝佳办法!
再问: 刚补充的这个问题的关键点是,预先不知道到底有几个水平折线(2个,3个,4个都有可能),只需找到长度最长的那个水平折线即可!
再答: 适合多个的情况,但个数只能人工控制,而且越多,计算复杂度也越高一些。如果只需“找到长度最长的那个水平折线”,这不是最佳方式,试试下面的方法:
clearclc
a=[1 2 2.5 3.2 5 5.1 5 5.2 5 5.3 5.2 7 11 16 17 17+[5.1 5 5.2 5 5.3]];
n=length(a);tol=0.5;% tol 为寻找水平点时,容许的数据误差da=[abs(diff(a))<tol,0];% |差分|j1=0;j2=0;s1=0;s2=0;for i=1:n if da(i)==0 if s2<s1 s2=s1;%s2 最长水平段的数据个数-1 j2=j1;%j2 最长水平段的起始下标 end s1=0;j1=0; else if j1==0 j1=i;%j1 水平段的起始下标 end s1=s1+1;%s1 水平段的数据个数-1 endend
plot(a,'b*')hold onplot(j2:(j2+s2),a(j2:(j2+s2)),'-r')
再问: 谢谢啦!
MATLAB中怎样找出一维向量的急剧变化点? 比如a=[1,2,3,2.5,4,1
matlab抽取想从一个向量中每N个抽取一个元素,组成新的向量,matlab里该用哪个函数?比如A=[1 2 3 4 5
matlab中怎么定义元素相同的向量.比如1*27个1 A=ones[(1:1:27)] 怎么定义1行27列的2向量
MATLAB中怎样从矩阵中找出大于1的数,并将这些数排成一个列向量
用MATLAB算向量如何用MATLAB计算空间向量的数量积、向量积、夹角和模若向量A=(1,2,3)怎么告诉MATLAB
用matlab如何实现:有一矩阵A,找出矩阵中大于1的元素,并将它们排成列向量B?
在MATLAB中如何建立一个包含随机字母的一维1×10向量a
设向量a是以A(-1,2)为始点,且与向量b=(3,4)平行的单位向量,求向量a的终点坐标
matlab如何给向量的分量定义函数? 比如 y=zeros(4,1),实现到y=[x,x^2,x^3,x^4],我要用
向量叉乘如何计算比如向量a=(1,2,3),b=(4,5,6)a叉乘b的计算过程应该是怎样的,求详解
MATLAB 中 a=[1 2 3] b=a' a和b分别是什么向量?分别占多少字节?a和b的关系又是什么?
在 matlab中比如x=1,y=2,要用m表示这个点的代码怎么写