my code keeps looping indefinitely and I could not figure out why, please help
조회 수: 1 (최근 30일)
이전 댓글 표시
%% parameter
SNR_dB = 10;%[0:5:20];
SNR = 10^(SNR_dB/10.);
N_iter = 100;
n = 256; % number of beams (transmit antennas)
%K = 32; % number of users
L = 3; % number of paths per user
lamada = 1; % wavelength
d = lamada/2;
%N = K; % number of retained RF chains for conventional beamspace MIMO IA-BS
P = 32; % total transmitted power
Imax = 30; % iteration times of power allocation
temp_it = [];
K_list = 10:10:50;
%%
for i_snr = 1:length(K_list)
K = K_list(i_snr);
N = K;
%SNR = SNR_linear(i_snr);
temp = 0; temp1 = 0; temp2 = 0; temp3 = zeros(1,Imax); temp4 = zeros(1,Imax); temp5 = 0; temp6 = 0;
temp22 = 0; temp33 = zeros(1,Imax); temp44 = zeros(1,Imax); temp55 = 0; temp66 = 0;
for iter = 1:N_iter
H = beamspace_channel(n,K,L); % generate the signalspace channel
U = zeros(n,n);
deta = 1/n;
for i = -(n-1)/2:1:(n-1)/2
U(:,i+(n+1)/2) = sqrt(1/n)*exp(1i*[0:n-1]*2*pi*deta*i).';
end
H_beam = U.'*H; % beamspace channel
[Hr1,Hr1_e] = IA_BS(H_beam,H_beam); % IA-BS
[Hr3,Hr3_e,F3,rf_num3,setf3] = reduce_RF(H_beam,K,H_beam); % NOMA mmWave-P1
%% Full digital
F = H_beam*inv(H_beam'*H_beam);
beta = sqrt(P/trace(F'*F));
H_eq = H_beam'*F;
for k = 1:K
sum_inf = sum(abs(H_eq(k,:)).^2)-abs(H_eq(k,k))^2;
temp = temp+log2(1+abs(H_eq(k,k))^2/(sum_inf+1/(SNR*beta^2)));
end
%% IA-BS
F1 = Hr1_e*inv(Hr1_e'*Hr1_e);
beta1 = sqrt(P/trace(F1'*F1));
H_eq1 = Hr1'*F1;
for k = 1:K
sum_inf = sum(abs(H_eq1(k,:)).^2)-abs(H_eq1(k,k))^2;
temp1 = temp1+log2(1+abs(H_eq1(k,k))^2/(sum_inf+1/(SNR*beta1^2)));
end
%% NOMA mmWave
[SE,EE,ite,power1] = PA(Hr3,F3,setf3,K,rf_num3,1/SNR,P,Imax);
temp3 = temp3+SE;
temp33 = temp33+EE;
%% OMA mmWave
beta3 = P/trace(F3'*F3);
H_eq3 = Hr3'*F3;
for i = 1:rf_num3
usern = setf3(i,:);
usern(usern==0) = [];
unum = length(usern);
for m = 1:unum
sum_inf = sum(abs(H_eq3(usern(m),:)).^2)-sum(abs(H_eq3(usern(m),usern(1:end))).^2);
temp5 = temp5+log2(1+abs(H_eq3(usern(m),usern(m)))^2/(sum_inf+1/SNR/unum/beta3))/unum;
temp55 = temp55+log2(1+abs(H_eq3(usern(m),usern(m)))^2/(sum_inf+1/SNR/unum/beta3))/unum/(P+rf_num3*305+200)*10^3;
end
end
end
C(i_snr) = temp/N_iter;
C1(i_snr) = temp1/N_iter;
C3(i_snr) = temp3(end)/N_iter;
C5(i_snr) = temp5/N_iter;
C00(i_snr) = temp/N_iter/(P+n*305+200)*10^3;
C11(i_snr) = temp1/N_iter/(P+K*305+200)*10^3;
C33(i_snr) = temp33(end)/N_iter;
C55(i_snr) = temp55/N_iter;
temp_it = [temp_it;temp3];
end
%CI3 = temp_it(3,:)/N_iter;
%%
figure;
plot(K_list,C,'k-*','Linewidth',1.5);
hold on
plot(K_list,C1,'r-*','Linewidth',1.5);
hold on
plot(K_list,C3,'g-*','Linewidth',1.5);
hold on
plot(K_list,C5,'c-*','Linewidth',1.5);
grid on
xlabel('The number of users');
ylabel('Spectral efficiency');
legend('Fully digital MIMO', 'The proposed beamspace MIMO-NOMA', 'MIMO-OMA', 'IA beam selection');
figure;
plot(K_list,C00,'k-','Linewidth',1.5);
hold on
plot(K_list,C11,'r-','Linewidth',1.5);
hold on
plot(K_list,C33,'g-','Linewidth',1.5);
hold on
plot(K_list,C55,'c-','Linewidth',1.5);
grid on
xlabel('The number of users');
ylabel('Energy efficiency');
legend( 'The proposed beamspace MIMO-NOMA', 'MIMO-OMA', 'IA beam selection', 'Fully digital MIMO');
% figure;
% plot(ite,CI3,'g-','Linewidth',1.5);
% grid on
% xlabel('Iteration');
% ylabel('Spectral efficiency');
댓글 수: 0
채택된 답변
Jan
2023년 2월 1일
이동: Jan
2023년 2월 1일
No, the loops do run run infinitely. They are only slow. Check this with displaying a loop counter.
Use the profile to find the bottleneck:
profile on
Then start the code. Press Ctrl-C after some time.
profile report
In which lines does Matlab spent the most time? Start optimizing the code there.
U is constant, isn't it? So avoid to create it in each iteration again, but do this once before the loop:
U = zeros(n,n);
deta = 1/n;
for i = -(n-1)/2:1:(n-1)/2
U(:,i+(n+1)/2) = sqrt(1/n)*exp(1i*[0:n-1]*2*pi*deta*i).';
end
Or do I see correctly that even H_beam is a constant?
댓글 수: 0
추가 답변 (0개)
참고 항목
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!