data_gen.m 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. function [X, X_theo, W, F_theo, Omega_G, Omega_F, Phi_G, Phi_F, Ginit, Finit] = data_gen(config, run)
  2. rng(run+1306) % Random seed
  3. s_width = config.sceneWidth;
  4. s_length = config.sceneLength;
  5. N_Ref = config.numRef;
  6. N_Cpt = config.numSensor;
  7. N_sousCpt = config.numSubSensor;
  8. Bound_phen = reshape(config.Bound_phen(1:2*N_sousCpt),[2 N_sousCpt])';
  9. Mu_beta = config.Mu_beta;
  10. Mu_alpha = config.Mu_alpha;
  11. Bound_beta = config.Bound_beta;
  12. Bound_alpha = config.Bound_alpha;
  13. gamma = config.gamma;
  14. MV = config.mvR;
  15. RV = config.rdvR;
  16. noise = config.noise;
  17. %% Scene simulation
  18. n_pic = 5;
  19. s_n = s_width*s_length; % Total number of areas in the scene
  20. [xx,yy] = meshgrid((-1:2/(s_width-1):1),(-1:2/(s_length-1):1));
  21. xxyy = cat(2,xx(:),yy(:));
  22. G_theo = ones(s_n,1);
  23. for sensor = 1:N_sousCpt
  24. g = zeros(s_n,1);
  25. for pic = 1:n_pic
  26. mu = 2*(rand(1,2)-0.5);
  27. sig = diag([0.2,0.45]);
  28. g = g + mvnpdf(xxyy,mu,sig);
  29. end
  30. g = (Bound_phen(sensor,2) - Bound_phen(sensor,1))/(max(g)-min(g))*(g-min(g)) + Bound_phen(sensor,1);
  31. G_theo = cat(2, G_theo, g);
  32. end
  33. %% Sensors simulation
  34. F_theo = zeros(N_sousCpt+1, N_sousCpt*(N_Cpt+1));
  35. for sensor = 1:N_sousCpt
  36. F_theo(1,(sensor-1)*(N_Cpt+1)+1:sensor*(N_Cpt+1)) = ...
  37. cat(2, max(Bound_beta((sensor-1)*2+1), min(Bound_beta((sensor-1)*2+2), ...
  38. Mu_beta(sensor)+(Bound_beta((sensor-1)*2+2)-Bound_beta((sensor-1)*2+1))*0.55*randn(1,N_Cpt))), 0);
  39. end
  40. for sen = 1:N_sousCpt
  41. f_theo = cat(2, max(Bound_alpha((sen-1)*2+1),...
  42. min( Bound_alpha((sen-1)*2+2), ...
  43. Mu_alpha(sen)+(Bound_alpha((sen-1)*2+2)-Bound_alpha((sen-1)*2+1))*0.25*randn(1,N_Cpt))), 1);
  44. F_theo(sen+1, (sen-1)*(N_Cpt+1)+1:sen*(N_Cpt+1)) = f_theo;
  45. C = 10^(-gamma/20)*mean(Bound_phen(sen,:),2)*f_theo(1:end-1);
  46. list_nosen = 1:N_sousCpt;
  47. list_nosen(sen) = [];
  48. meanPhen_nosen = norm(mean(Bound_phen(list_nosen,:)));
  49. for sor = list_nosen
  50. f_theo_nosen = rand(1,N_Cpt).*C/(sqrt(N_sousCpt)*meanPhen_nosen);
  51. other_f_theo = cat(2, f_theo_nosen, 0);
  52. F_theo(sor+1, (sen-1)*(N_Cpt+1)+1:sen*(N_Cpt+1)) = other_f_theo;
  53. end
  54. end
  55. % F_theo = [];
  56. %
  57. % for sensor = 1:N_sousCpt
  58. % F_theo = cat(2, F_theo, cat(2, max(Bound_beta(1), min(Bound_beta(2), Mu_beta+.5*randn(1,N_Cpt))), 0));
  59. % end
  60. %
  61. %
  62. % for sen = 1:N_sousCpt
  63. % f_theo = [];
  64. % for sor = 1:N_sousCpt
  65. % if sen==sor
  66. % f_theo = cat(2, f_theo, cat(2, max(Bound_alpha(1), min(Bound_alpha(2), Mu_alpha+.5*randn(1,N_Cpt))), sen==sor));
  67. % else
  68. % f_theo = cat(2, f_theo, cat(2, 0*max(Bound_alpha(1), min(Bound_alpha(2), Mu_alpha+.5*randn(1,N_Cpt))), sen==sor));
  69. % end
  70. % end
  71. % F_theo = cat(1, F_theo, f_theo);
  72. % end
  73. %% Data simulation
  74. X_theo = G_theo*F_theo; % Theoretical matrix X (see eq.(2) of [1])
  75. W = zeros(s_n,N_Cpt+1);
  76. idx_Ref = randperm(s_n);
  77. idx_Ref = idx_Ref(1:N_Ref); % Reference measurement locations
  78. W(idx_Ref,end) = 1;
  79. N_RV = round(N_Cpt*RV); % Nb. of sensors having a RendezVous
  80. idx_CptRV = randperm(N_Cpt);
  81. idx_CptRV = idx_CptRV(1:N_RV); % Selection of sensors having a RendezVous
  82. idx_RefRV = randi(N_Ref,1,N_Cpt);
  83. idx_RefRV = idx_Ref(idx_RefRV(1:N_RV)); % Selection of the references for each RendezVous
  84. for i = 1 : N_RV
  85. W(idx_RefRV(i),idx_CptRV(i)) = 1;
  86. end
  87. N_data = round((1-MV)*(N_Cpt)*(s_n-N_Ref)); % Nb. of measurements in data matrix X
  88. xCpt = 1 : s_n;
  89. xCpt(idx_Ref) = []; % Reference free locations
  90. [xx,yy] = meshgrid(xCpt,1:N_Cpt); % Possibly sensed locations
  91. idx_data = randperm((s_n-N_Ref)*N_Cpt);
  92. for i = 1 : N_data
  93. W(xx(idx_data(i)),yy(idx_data(i))) = 1; % Sensor measurement placement
  94. end
  95. W = repmat(W, 1, N_sousCpt);
  96. if isinf(noise)
  97. N = zeros(s_n,N_sousCpt*(N_Cpt+1));
  98. else
  99. N = randn(s_n,N_sousCpt*(N_Cpt+1)); % Noise simulation
  100. N(:,(N_Cpt+1)*(1:N_sousCpt)) = 0; % No noise for the references
  101. for i = 1:N_sousCpt
  102. noise_i = N(:,(i-1)*(N_Cpt+1)+1:i*(N_Cpt+1)-1);
  103. X_i = X_theo(:,(i-1)*(N_Cpt+1)+1:i*(N_Cpt+1)-1);
  104. N(:,(i-1)*(N_Cpt+1)+1:i*(N_Cpt+1)-1) = (max(X_i(:))-min(X_i(:)))/(max(noise_i(:))-min(noise_i(:)))*10^(-noise/20)*noise_i;
  105. end
  106. N = max(N,-X_theo);
  107. end
  108. X = W.*(X_theo+N); % Data matrix X
  109. Omega_G = [ones(s_n,1),W(:,(N_Cpt+1)*(1:N_sousCpt))]; % Mask on known values in G (see eq.(14) of [1])
  110. Omega_F = zeros(N_sousCpt+1,N_sousCpt*(N_Cpt+1));
  111. Omega_F(:,(N_Cpt+1)*(1:N_sousCpt)) = 1; % Mask on known values in F (see eq.(15) of [1])
  112. Phi_G = [ones(s_n,1),X(:,(N_Cpt+1)*(1:N_sousCpt))]; % Known values in G (see eq.(14) of [1])
  113. Phi_F = F_theo .* Omega_F; % Known values in F (see eq.(15) of [1])
  114. %% Initialization
  115. Ginit = ones(s_n,1);
  116. for sensor = 1:N_sousCpt
  117. if ~isempty(find(sensor==config.CalibratedSensor,1))
  118. g = X(:, (sensor-1)*(N_Cpt+1)+1:sensor*(N_Cpt+1)-1);
  119. g(~W(:,(sensor-1)*(N_Cpt+1)+1:sensor*(N_Cpt+1)-1)) = NaN;
  120. g = 1/Mu_alpha(sensor)*(nanmean(g,2)-Mu_beta(sensor));
  121. g(isnan(g))=0;
  122. else
  123. g = Phi_G(:,sensor+1);
  124. g(g==0) = mean(g(g~=0));
  125. g(Phi_G(:,sensor+1)==0) = abs(1+0.05*randn(size(find(Phi_G(:,sensor+1)==0)))).*g(Phi_G(:,sensor+1)==0);
  126. end
  127. Ginit = cat(2, Ginit, g);
  128. end
  129. Ginit = (1-Omega_G).*Ginit+Phi_G;
  130. % Ginit = G_theo;
  131. Finit = zeros(N_sousCpt+1, N_sousCpt*(N_Cpt+1));
  132. for sensor = 1:N_sousCpt
  133. Finit(1,(sensor-1)*(N_Cpt+1)+1:sensor*(N_Cpt+1)) = ...
  134. cat(2, max(Bound_beta((sensor-1)*2+1), min(Bound_beta((sensor-1)*2+2), ...
  135. Mu_beta(sensor)+(Bound_beta((sensor-1)*2+2)-Bound_beta((sensor-1)*2+1))*0.55*randn(1,N_Cpt)))+eps, 0);
  136. end
  137. for sen = 1:N_sousCpt
  138. finit = cat(2, max(Bound_alpha((sen-1)*2+1),...
  139. min( Bound_alpha((sen-1)*2+2), ...
  140. Mu_alpha(sen)+(Bound_alpha((sen-1)*2+2)-Bound_alpha((sen-1)*2+1))*0.25*randn(1,N_Cpt)))+eps, 1);
  141. Finit(sen+1, (sen-1)*(N_Cpt+1)+1:sen*(N_Cpt+1)) = finit;
  142. C = 10^(-0/20)*mean(Bound_phen(sen,:),2)*finit(1:end-1);
  143. list_nosen = 1:N_sousCpt;
  144. list_nosen(sen) = [];
  145. meanPhen_nosen = norm(mean(Bound_phen(list_nosen,:)));
  146. for sor = list_nosen
  147. finit_nosen = rand(1,N_Cpt).*C/(sqrt(N_sousCpt)*meanPhen_nosen)+eps;
  148. other_finit = cat(2, finit_nosen, 0);
  149. Finit(sor+1, (sen-1)*(N_Cpt+1)+1:sen*(N_Cpt+1)) = other_finit;
  150. end
  151. end
  152. % Finit = F_theo;
  153. end