matlab程序优化问题
我matlab学得不好 对于矩阵的理解和循环的使用很差劲 希望高手帮助我使用循环语句简化一下程序:
t=1:16384;
t=t*1/2000;
x=sin(2*pi*20*t+5)+0.4*sin(2*pi*40*t+140);
z=x+2*randn(size(t));
figure(1)
subplot(4,1,1)
plot(t,z)
title('信号1');
xlabel('时间(time)t/s'),ylabel('幅值/mm');
for i=1:3
m(i,:)=z(i*2000:i*2000+1024);
end
subplot(4,1,2)
plot(m(1,:))
title('截取信号1');
subplot(4,1,3)
plot(m(2,:))
title('截取信号2');
subplot(4,1,4)
plot(m(3,:))
title('截取信号3');
%对截取信号做emd
imf1=emd(m(1,:));
imf2=emd(m(2,:));
imf3=emd(m(3,:));
for i=1:8
x1(i,:)=imf1(i,:);
end
figure(2)
subplot(4,1,1);plot(x1(1,:)),title('imf1-1');
subplot(4,1,2);plot(x1(2,:)),title('imf1-2');
subplot(4,1,3);plot(x1(3,:)),title('imf1-3');
subplot(4,1,4);plot(x1(4,:)),title('imf1-4');
figure(3)
subplot(4,1,1);plot(x1(5,:)),title('imf1-5');
subplot(4,1,2);plot(x1(6,:)),title('imf1-6');
subplot(4,1,3);plot(x1(7,:)),title('imf1-7');
subplot(4,1,4);plot(x1(8,:)),title('imf1-8');
for i=1:8
x2(i,:)=imf2(i,:);
end
figure(4)
subplot(4,1,1);plot(x2(1,:)),title('imf2-1');
subplot(4,1,2);plot(x2(2,:)),title('imf2-2');
subplot(4,1,3);plot(x2(3,:)),title('imf2-3');
subplot(4,1,4);plot(x2(4,:)),title('imf2-4');
figure(5)
subplot(4,1,1);plot(x2(5,:)),title('imf2-5');
subplot(4,1,2);plot(x2(6,:)),title('imf2-6');
subplot(4,1,3);plot(x2(7,:)),title('imf2-7');
subplot(4,1,4);plot(x2(8,:)),title('imf2-8');
for i=1:8
x3(i,:)=imf3(i,:);
end
figure(6)
subplot(4,1,1);plot(x3(1,:)),title('imf3-1');
subplot(4,1,2);plot(x3(2,:)),title('imf3-2');
subplot(4,1,3);plot(x3(3,:)),title('imf3-3');
subplot(4,1,4);plot(x3(4,:)),title('imf3-4');
figure(7)
subplot(4,1,1);plot(x3(5,:)),title('imf3-5');
subplot(4,1,2);plot(x3(6,:)),title('imf3-6');
subplot(4,1,3);plot(x3(7,:)),title('imf3-7');
subplot(4,1,4);plot(x3(8,:)),title('imf3-8');
%以下求imf最大值及坐标
for i=1:8
Max=max(x1(i));
B(i,2)=(find(x1(i,:)==Max));
B(i,1)=Max;
end
%以下求imf最大值及坐标
for i=1:8
Max=max(x2(i));
B(i,2)=(find(x2(i,:)==Max));
B(i,1)=Max;
end
%以下求imf最大值及坐标
for i=1:8
Max=max(x3(i));
B(i,2)=(find(x3(i,:)==Max));
B(i,1)=Max;
end
补充:就是把重复的地方都用循环来写 参数设置什么的请写明 谢谢
追问:运行到这:imf(:,:,i)=emd(m(i,:));%%
就提示??? Subscripted assignment dimension mismatch.
Error in ==> youhua at 16
imf(:,:,i)=emd(m(i,:));%%
是怎么回事呢?
emd是你自定义的函数吧,我不知道这个函数怎么运行的,也不清楚经过这个函数处理后得到的imf矩阵的行数和列数,所以做了假定,你可以根据实际情况改一下
由于m(i,:)是1024点的(我之前的程序错了,应该是1024而非1025),对m(i,:)进行emd处理后m每一行(即每个截取信号)都会被处理为一个8*1024的矩阵,矩阵的每一行都是一个imf模值,因此你用imf(:,:,i)存储3个8*1024矩阵我觉得应该是对的,但是出现这个错误,我不知道怎么修改
你把emd的代码等所有相关的代码贴出来,我帮你看一下
有问题欢迎追问,满意请采纳,谢谢!!
答案:%主要是三维矩阵的应用
t=1:16384;
t=t*1/2000;
x=sin(2*pi*20*t+5)+0.4*sin(2*pi*40*t+140);
z=x+2*randn(size(t));
figure(1)
subplot(4,1,1)
plot(t,z)
title('信号1');
xlabel('时间(time)t/s'),ylabel('幅值/mm');
m=zeros(3,1025);
imf=zeros(8,1025,3);%%行数和列数可能需要修改
for i=1:3
m(i,:)=z(i*2000:i*2000+1024);
imf(:,:,i)=emd(m(i,:));%%
subplot(4,1,i+1)
plot(m(i,:))
title(['截取信号' num2str(i)]);
end
%对截取信号做emd
%假设imf1是8行1025列的矩阵,
% imf1=emd(m(1,:));%emd是自定义函数,不知道
% imf2=emd(m(2,:));
% imf3=emd(m(3,:));
x=zeros(8,1025,3);%%行数和列数可能需要修改
for j=1:3
for i=1:8
x(i,:,j)=imf(i,:,j);
if i<=4
figure(2*j)
subplot(4,1,i)
else
figure(2*j+1)
subplot(4,1,i-4);
end
plot(x(i,:,j))
title(['imf' num2str(j) '-' num2str(i)])
end
end
B=zeros(8,2,3);
for j=1:3
for i=1:8
[Max index]=max(x(i,:,j));
B(i,2,j)=index;
B(i,1,j)=Max;
end
end
上一个:求一段用matlab读取wav文件的程序
下一个:我的matlab程序怎么不出图呢,帮忙指点,必有重谢。。。