请问如何实现多次仿真结果仿真?
问题描述:以下代码是仿真一次得到的结果,如何得到仿真100次以上的结果,并绘制出类似下面的图片。
其中结果一个为方位角,一个为俯仰角。(图片是仿真几百次后点的汇集点)
clear all
close all
derad=pi/180;
radeg=180/pi;
twpi=2*pi;
kelmx=8;
kelmy=10;
dd=0.5;%阵元间隔
dx=0:dd:(kelmx-1)*dd;%X轴阵元分布
dy=0:dd:(kelmy-1)*dd;%Y轴阵元分布
iwave=3;%目标数
L=iwave;
theta1=[10 30 50];%波达方向
theta2=[15 35 55];%波达方向
snr=20;%信噪比(dB)
n=200;%快拍数
Ax=exp(-i*twpi*dx.'*(sin(theta1*derad).*cos(theta2*derad)));%X轴上阵元对应的方向矩阵
Ay=exp(-i*twpi*dy.'*(sin(theta1*derad).*sin(theta2*derad)));%Y轴上阵元对应的方向矩阵
S=randn(iwave,n);
X0=Ax*S;%接收信号
X=awgn(X0,snr,'measured');%加入高斯白噪声
Y0=Ay*S;
Y=awgn(Y0,snr,'measured');
Rxy=X*Y';%协方差矩阵
P=5;
Q=6;
...............%构造增广矩阵%................
Re=[];
for kk=1:kelmx-P+1
Rx=[];
for k=1:P
Rx=[Rx;R_hankel(k+kk-1,Rxy,kelmy,Q)];
end
Re=[Re,Rx];
end
...............%估计uk和vk%................
[Ue,Se,Ve]=svd(Re);
Uesx=Ue(:,1:L);
Uesx1=Uesx(1:(P-1)*Q,:);
Uesx2=Uesx(Q+1:P*Q,:);
Fx=pinv(Uesx1)*Uesx2;
[EVx,Dx]=eig(Fx);
EVAx=diag(Dx).';
for im=1:Q
Uesy(((im-1)*P+1):P*im,:)=Uesx(im:Q:(im+Q*(P-1)),:);
end
Uesy1=Uesy(1:(Q-1)*P,:);
Uesy2=Uesy(P+1:P*Q,:);
Fy=pinv(Uesy1)*Uesy2;
[EVy,Dy]=eig(Fy);
EVAy=diag(Dy)';
F=0.5*Fx+0.5*Fy;
[EV,D]=eig(F);
P1=EV\EVx;
P2=EV\EVy;
P1=abs(P1);
P2=abs(P2);
P11=P1';
P21=P2';
[c,Px]=max(P11);
[cc,Py]=max(P21);
EVAx=EVAx(:,Px);%估计出uk
EVAy=EVAy(:,Py);%估计出vk
...............%估计出DOA%................
theta10=asin(sqrt((angle(EVAx)/pi).^2+(angle(EVAy)/pi).^2))*radeg;
theta20=atan(angle(EVAy)./angle(EVAx))*radeg;
引用函数
function R=R_hankel(m,Rxy,N,Q)
R1=[];
R2=[];
for mm=1:Q
R1=[R1;Rxy(m,mm)];
end
for i=1:N-Q+1
R2=[R2,Rxy(m,i+Q-1)];
end
R=hankel(R1,R2);
引用chatgpt的回答:
要实现多次仿真结果的仿真,可以使用循环语句,对仿真部分的代码进行多次重复运行。具体而言,可以将仿真代码放在一个 for 循环中,每次循环生成一组随机数据,然后调用相同的仿真函数进行仿真,最后将得到的结果保存下来。
以下是一个基于你提供的代码修改后的示例,它可以进行 100 次仿真,并将结果保存下来:
clear all
close all
derad=pi/180;
radeg=180/pi;
twpi=2*pi;
kelmx=8;
kelmy=10;
dd=0.5;%阵元间隔
dx=0:dd:(kelmx-1)*dd;%X轴阵元分布
dy=0:dd:(kelmy-1)*dd;%Y轴阵元分布
iwave=3;%目标数
L=iwave;
theta1=[10 30 50];%波达方向
theta2=[15 35 55];%波达方向
snr=20;%信噪比(dB)
n=200;%快拍数
Ax=exp(-i*twpi*dx.'*(sin(theta1*derad).*cos(theta2*derad)));%X轴上阵元对应的方向矩阵
Ay=exp(-i*twpi*dy.'*(sin(theta1*derad).*sin(theta2*derad)));%Y轴上阵元对应的方向矩阵
S=randn(iwave,n);
for iter=1:100 % 进行 100 次仿真
disp(['Iteration ', num2str(iter)]);
X0=Ax*S;%接收信号
X=awgn(X0,snr,'measured');%加入高斯白噪声
Y0=Ay*S;
Y=awgn(Y0,snr,'measured');
Rxy=X*Y';%协方差矩阵
P=5;
Q=6;
...............%构造增广矩阵%................
Re=[];
for kk=1:kelmx-P+1
Rx=[];
for k=1:P
Rx=[Rx;R_hankel(k+kk-1,Rxy,kelmy,Q)];
end
Re=[Re,Rx];
end
...............%估计uk和vk%................
[Ue,Se,Ve]=svd(Re);
Uesx=Ue(:,1:L);
Uesx1=Uesx(1:(P-1)*Q,:);
Uesx2=Uesx(Q+1:P*Q,:);
Fx=pinv(Uesx1)*Uesx2;
[EVx,Dx]=eig(Fx);
EVAx=diag(Dx).';
for im=1:Q
Uesy(((im-1)*P+1):P*im,:)=Uesx(im:Q:(im+Q*(P-1)),:);
end
Uesy1=Uesy(1:(Q-1)*P,:);
Uesy2=Uesy(P+1:P*Q,:);
Fy=pinv(Uesy1)*Uesy2;
[EVy,Dy]=eig(Fy);
EVAy=diag(Dy)';
F=0.5*Fx+0.5*Fy;
[EV,D]=eig(F);
P1=EV\EVx;
P2=EV\EVy;
P1=abs(P1);
P2=abs(P2);
P11=P1';
P21=P2';
[c,Px]=max(P11);
[cc,Py]=max(P21);
EVAx=EVAx(:,Px);%估计出uk
EVAy=EVAy(:,Py);%估计出vk
...............%估计出DOA%................
theta10=asin(sqrt((angle(EVAx)/pi).^2+(angle(EVAy)/pi).^2))*radeg;
theta20=atan(angle(EVAy)./angle(EVAx))*radeg;
% 将结果保存
results(iter).theta1 = theta10;
results(iter).theta2 = theta20;
end
% 绘制图像
figure;
for iter=1:100
plot(results(iter).theta2, results(iter).theta1, 'b.');
hold on;
end
xlabel('俯仰角');
ylabel('方位角');
title('多次仿真结果');
在上述代码中,我们使用了一个 for 循环来重复运行 100 次仿真部分的代码,并将得到的每组 DOA 结果保存到一个结构体数组中。最后,可以根据这些结果绘制出类似于你提供的图片的散点图。
根据你的代码修改调试后,这个是循环10次的,需要循环100次,就改一下这两个地方为100即可:num_simulations = 100,for sim=1:100,代码如下:
clear all
close all
derad=pi/180;
radeg=180/pi;
twpi=2*pi;
kelmx=8;
kelmy=10;
dd=0.5;
dx=0:dd:(kelmx-1)*dd;
dy=0:dd:(kelmy-1)*dd;
iwave=3;
L=iwave;
theta1=[10 30 50];
theta2=[15 35 55];
snr=20;
n=200;
Ax=exp(-i*twpi*dx.'*(sin(theta1*derad).*cos(theta2*derad)));
Ay=exp(-i*twpi*dy.'*(sin(theta1*derad).*sin(theta2*derad)));
num_simulations = 10;
theta10_all = zeros(length(theta1),num_simulations);
theta20_all = zeros(length(theta1),num_simulations);
for sim=1:num_simulations
S=randn(iwave,n);
X0=Ax*S;
X=awgn(X0,snr,'measured');
Y0=Ay*S;
Y=awgn(Y0,snr,'measured');
Rxy=X*Y';
P=5;
Q=6;
Re=[];
for kk=1:kelmx-P+1
Rx=[];
for k=1:P
Rx=[Rx;R_hankel(k+kk-1,Rxy,kelmy,Q)];
end
Re=[Re,Rx];
end
[Ue,Se,Ve]=svd(Re);
Uesx=Ue(:,1:L);
Uesx1=Uesx(1:(P-1)*Q,:);
Uesx2=Uesx(Q+1:P*Q,:);
Fx=pinv(Uesx1)*Uesx2;
[EVx,Dx]=eig(Fx);
EVAx=diag(Dx).';
for im=1:Q
Uesy(((im-1)*P+1):P*im,:)=Uesx(im:Q:(im+Q*(P-1)),:);
end
Uesy1=Uesy(1:(Q-1)*P,:);
Uesy2=Uesy(P+1:P*Q,:);
Fy=pinv(Uesy1)*Uesy2;
[EVy,Dy]=eig(Fy);
EVAy=diag(Dy)';
F=0.5*Fx+0.5*Fy;
[EV,D]=eig(F);
P1=EV\EVx;
P2=EV\EVy;
P1=abs(P1);
P2=abs(P2);
P11=P1';
P21=P2';
[c,Px]=max(P11);
[cc,Py]=max(P21);
EVAx=EVAx(:,Px);
EVAy=EVAy(:,Py);
theta10=asin(sqrt((angle(EVAx)/pi).^2+(angle(EVAy)/pi).^2))*radeg;
theta20=atan(angle(EVAy)./angle(EVAx))*radeg;
theta10_all(:,sim) = theta10;
theta20_all(:,sim) = theta20;
end
% 绘制汇集点图像
figure;
subplot(2,1,1);
hold on;
for sim=1:10
% 重新生成数据
S=randn(iwave,n);
X0=Ax*S;
X=awgn(X0,snr,'measured');
Y0=Ay*S;
Y=awgn(Y0,snr,'measured');
Rxy=X*Y';
Re=[];
for kk=1:kelmx-P+1
Rx=[];
for k=1:P
Rx=[Rx;R_hankel(k+kk-1,Rxy,kelmy,Q)];
end
Re=[Re,Rx];
end
[Ue,Se,Ve]=svd(Re);
Uesx=Ue(:,1:L);
Uesx1=Uesx(1:(P-1)*Q,:);
Uesx2=Uesx(Q+1:P*Q,:);
Fx=pinv(Uesx1)*Uesx2;
[EVx,Dx]=eig(Fx);
EVAx=diag(Dx).';
for im=1:Q
Uesy(((im-1)*P+1):P*im,:)=Uesx(im:Q:(im+Q*(P-1)),:);
end
Uesy1=Uesy(1:(Q-1)*P,:);
Uesy2=Uesy(P+1:P*Q,:);
Fy=pinv(Uesy1)*Uesy2;
[EVy,Dy]=eig(Fy);
EVAy=diag(Dy)';
F=0.5*Fx+0.5*Fy;
[EV,D]=eig(F);
P1=EV\EVx;
P2=EV\EVy;
P1=abs(P1);
P2=abs(P2);
P11=P1';
P21=P2';
[c,Px]=max(P11);
[cc,Py]=max(P21);
EVAx=EVAx(:,Px);
EVAy=EVAy(:,Py);
theta10=asin(sqrt((angle(EVAx)/pi).^2+(angle(EVAy)/pi).^2))*radeg;
theta20=atan(angle(EVAy)./angle(EVAx))*radeg;
end
% 绘制汇集点图像
figure;
subplot(2,1,1);
hold on;
for sim=1:10
plot(theta20_all(:,sim),theta10_all(:,sim), 'o')
end
xlabel('theta2')
ylabel('theta1')
title('汇集点')
function R=R_hankel(m,Rxy,N,Q)
R1=[];
R2=[];
for mm=1:Q
R1=[R1;Rxy(m,mm)];
end
for i=1:N-Q+1
R2=[R2,Rxy(m,i+Q-1)];
end
R=hankel(R1,R2);
end
运行结果如下:
要实现多次仿真结果的仿真,可以通过编写一个循环,多次运行仿真程序,并将每次的结果保存下来。具体实现方式取决于仿真程序的编写语言和框架。在每次循环结束后,可以对多次仿真结果进行统计和分析。
要实现多次仿真结果的仿真,可以在现有的代码基础上,添加一个外层循环,每次循环都重复一遍仿真的过程,并将仿真得到的DOA结果保存下来。最后,可以将所有的DOA结果绘制在同一张图上,得到类似于题目中给出的图片。
下面是一个示例代码,其中添加了一个外层循环,重复100次仿真,并将得到的DOA结果保存到一个矩阵中:
clear all
close all
derad=pi/180;
radeg=180/pi;
twpi=2*pi;
kelmx=8;
kelmy=10;
dd=0.5;%阵元间隔
dx=0:dd:(kelmx-1)*dd;%X轴阵元分布
dy=0:dd:(kelmy-1)*dd;%Y轴阵元分布
iwave=3;%目标数
L=iwave;
theta1=[10 30 50];%波达方向
theta2=[15 35 55];%波达方向
snr=20;%信噪比(dB)
n=200;%快拍数
Ax=exp(-i*twpi*dx.'*(sin(theta1*derad).*cos(theta2*derad)));%X轴上阵元对应的方向矩阵
Ay=exp(-i*twpi*dy.'*(sin(theta1*derad).*sin(theta2*derad)));%Y轴上阵元对应的方向矩阵
S=randn(iwave,n);
P=5;
Q=6;
DOA = zeros(2, 100); % 用于保存DOA结果的矩阵
for k = 1:100
X0=Ax*S;%接收信号
X=awgn(X0,snr,'measured');%加入高斯白噪声
Y0=Ay*S;
Y=awgn(Y0,snr,'measured');
Rxy=X*Y';%协方差矩阵
...............%构造增广矩阵%................
Re=[];
for kk=1:kelmx-P+1
Rx=[];
for kk=1:P
Rx=[Rx;R_hankel(kk+kk-1,Rxy,kelmy,Q)];
end
Re=[Re,Rx];
end
...............%估计uk和vk%................
[Ue,Se,Ve]=svd(Re);
Uesx=Ue(:,1:L);
Uesx1=Uesx(1:(P-1)*Q,:);
Uesx2=Uesx(Q+1:P*Q,:);
Fx=pinv(Uesx1)*Uesx2;
[EVx,Dx]=eig(Fx);
EVAx=diag(Dx).';
for im=1:Q
Uesy(((im-1)*P+1):P*im,:)=Uesx(im:Q:(im+Q*(P-1)),:);
end
Uesy1=Uesy(1:(Q-1)*P,:);
Uesy2=Uesy(P+1:P*Q,:);
Fy=pinv(Uesy1)*Uesy2;
[EVy,Dy]=eig(Fy);
EVAy=diag(Dy)';
F=0.5*Fx+0.5*Fy;
[EV,D]=eig(F);
P1=EV\EVx;
P2=EV\EVy;
P1=abs(P1);
P2=abs(P2);
P11=P1';
P21=P2';
[c,Px]=max(P11);
[cc,Py]=max(P21);
EVAx=EVAx(:,Px);%估计出uk
EVAy=EVAy(:,Py);%估计出vk
...............%估计出DOA%................
theta10=asin(sqrt((angle(EVAx)/pi).^2+(angle(EVAy)/pi).^2))*radeg;
theta20=atan(angle(EVAy)./angle(EVAx))*radeg;
% 将DOA结果保存到矩阵中
DOA(:, k) = [theta10; theta20];
end
% 绘制DOA散点图
figure;
scatter(DOA(2,:), DOA(1,:), '.');
xlabel('Azimuth angle (degree)');
ylabel('Elevation angle (degree)');
title('DOA Scatter Plot');
在上面的代码中,我们添加了一个名为DOA
的2行100列的矩阵,用于保存重复100次仿真后得到的DOA结果。在每次仿真结束后,将得到的DOA结果存入DOA
矩阵中的第k
列。最后,我们使用scatter
函数绘制散点图,横坐标为DOA结果中的方位角,纵坐标为DOA结果中的俯仰角,可以得到类似于题目中给出的图片。
参考:https://www.cnblogs.com/sum-41/p/10799555.html
程序中有两种参数传递:
Java中都是值传递,只不过对于引用类型参数,值的内容是对象的引用。 当是基本类型时修改副本不能影响原值,而当是对象时,此时副本是地址,修改的是这个地址指向的对象,所以会影响原对象。(其实并没有定论,有的人说有引用传递,而在Java核心技术卷1和 疯狂java讲义中都说只有值传递)
简单来说就是,当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用(地址)。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。
有的时候传递引用参数时,可能会产生引用传递的错觉,是因为参数保存的是实际对象的地址值,你改变的只是地址值指向的堆内存中的实际对象,并没有真正改变参数,参数的地址值没有变。