2017-05-18 29 views
0

我有以下代碼創建100x2人口向量,根據函數f評估人口,然後根據獲得最低函數分數的前10位人口成員創建一個新人口:MATLAB:修改後的mvnrnd輸出

N = 100; 
N_elite = 0.1*N; 
dim = 2; 

a = 0; 
b = 3; 
x = (b-a).*rand(N, dim)+a; 

f = @(x) x(:,1).^2 + x(:,2).^2; 
cost = f(x) 
population_cost = [x,cost] 

x_sorted = sortrows(population_cost,dim+1) 
x_elite = x_sorted(1:N_elite,:) 

mu = mean(x_elite(:,[1:dim])) 
sigma = cov(x_elite(:,[1:dim])) 
x = mvnrnd(mu,sigma,N) 

該代碼使用mvnrnd來創建新的人口。我希望有一個具有以下屬性的新種羣向量:x(:,1)<x(:,2),也就是說,第一列中的每個值必須低於第二列中的每個值。在mvnrnd中是否有一個屬性/選項允許這樣做,而不必使用for循環來檢查每一行並執行切換,如果x(i,1)>x(i,2)

+1

您指定的要求是與具有多元高斯輸出不兼容分配。所以不,'mvnrnd'不能這樣做 –

回答

0

你不需要修改mvnrnd對於這一點,你可以簡單地使用sort沿第二維排序x(列):

% sort x columns such that x(i,1) < x(i,2) for all i 
x = sort(x,2,'ascend'); 
% check 
all(x(:,1) < x(:,2)) % yes