2013-07-18 4 views
0

У меня есть программа в MATLAB. Я хочу запустить программу 10 000 раз. Для каждого запуска я получаю окончательный вывод как счетчик. Я хочу экспортировать значение count для каждой итерации в глобальный массив или таблицу Excel. Я хочу, наконец, проверить массив count, который должен содержать 10 000 значений.Экспорт значений из командного окна Matlab

Пожалуйста, ребята, вы могли бы предложить способы сделать это. Я отправляю код тоже.

%%steps 
%1.Initialize the populations 
tic 
clc; clear all; close all; 
par_size=10; 
%Encode 
for i=1:par_size 
    par(i,:)=dec2bin(round(1+31*rand),10); 
    a(i) = bin2dec(par(i,:)); 
end 
orig_par=par; 
fitness = zeros(1,par_size); 
count=0; 
while sum(fitness)~=1000 
    count=count+1; 
%% 
%2.Evaluate fitness 
fitness = zeros(1,par_size); 
%The fitness function 
%count the no of one's in the string 
fitness = [(sum(par=='1',2)).*(sum(par=='1',2))].'; 
sum_fitness = sum(fitness) 
prob_fitness = fitness./sum_fitness; 
[~,I]=sort(prob_fitness); 
%I is the order of the fitness value 
prob_fitness_sort = prob_fitness(I); 
%sorting 
par = par(I,:); 

%% 
%3.Select Parents 
%Roulette wheel selection 
%generate cumulative probability 
cum_prob = zeros(size(prob_fitness)); 
A = zeros(size(prob_fitness)); 
for i=1:par_size 
    A(i) = prob_fitness_sort(i); 
    cum_prob(i) = sum(A); 
end 
new_pop = par; 
%Selection being done 
r1 = zeros(1,par_size); 
for i=1:par_size 
    r1(i) = rand; 
    if r1(i)<=cum_prob(1) 
     new_pop(i,:) = par(1,:); 
    elseif r1(i)>cum_prob(1) && r1(i)<=cum_prob(2) 
     new_pop(i,:) = par(2,:); 
    elseif r1(i)>cum_prob(2) && r1(i)<=cum_prob(3) 
     new_pop(i,:) = par(3,:); 
    elseif r1(i)>cum_prob(3) && r1(i)<=cum_prob(4) 
     new_pop(i,:) = par(4,:); 
    elseif r1(i)>cum_prob(4) && r1(i)<=cum_prob(5) 
     new_pop(i,:) = par(5,:); 
    elseif r1(i)>cum_prob(5) && r1(i)<=cum_prob(6) 
     new_pop(i,:) = par(6,:); 
    elseif r1(i)>cum_prob(6) && r1(i)<=cum_prob(7) 
     new_pop(i,:) = par(7,:); 
    elseif r1(i)>cum_prob(7) && r1(i)<=cum_prob(8) 
     new_pop(i,:) = par(8,:); 
    elseif r1(i)>cum_prob(8) && r1(i)<=cum_prob(9) 
     new_pop(i,:) = par(9,:); 
    elseif r1(i)>cum_prob(9) && r1(i)<=cum_prob(10) 
     new_pop(i,:) = par(10,:); 
    end 
end 
%new_pop is the new particle sample 

%% 
%4.Crossover and Mutate 

%crossover 
pc = 0.6; %pc is the crossover probability 
for i=1:2:par_size %selecting adjacent couples 
    r2 = rand; 
    if r2<=pc 
     l = size(new_pop, 2); 
     %choose the parents 
     %here adjacent parents are taken 
     breeders(1,:)=new_pop(i,:); 
     breeders(2,:)=new_pop(i+1,:); 
     %choose a crossover point 
     cp = randperm(l, 1);    
     %do crossover 
     b1 = [breeders(1, 1:cp), breeders(2, cp+1:end)]; 
     b2 = [breeders(2, 1:cp), breeders(1, cp+1:end)]; 
     new_pop(i,:) = b1; 
     new_pop(i+1,:) = b2; 
    end 
end 


%mutation 
%pm be mutation probability 
pm = 0.01; 
for i=1:par_size 
    r2 = rand; 
    if r2<=pm %mutation probability is 0.1 
     %Do mutation 
     %select random position 
     r3 = 1+round((10-1)*rand);   
     new_pop(i,r3)=num2str(abs(str2num(new_pop(i,r3))-1)); 
    end 
end 
par = new_pop; 
end 
orig_par 
par 
count 
toc 

Не волнуйтесь, программа работает успешно. Поскольку вы можете видеть, что значение, сгенерированное, поскольку счетчик отображается в конце каждого запуска программы. Я хочу экспортировать эти значения в глобальный массив или таблицу Excel в MATLAB, если это возможно.

Заранее спасибо.

Для любого запроса дайте комментарий!

ответ

0

Вы можете создать переменную count_nb и инициализировать ее до zeros(10000,1), а внутри цикла while (после count = count + 1) есть count_nb(count) = count. После того, как за пределами цикла while, вы можете написать переменную count_nb в Excel с помощью xlswrite или сохранить его в файл MAT, или записать его в текстовый файл, и т.д ...

+1

Кстати, с числами с плавающей точкой, вы не должны» t действительно проверяйте равенство или неравенство, как вы делаете в 'while sum (fitness) ~ = 1000'. Подробнее см. Http://matlab.wikia.com/wiki/FAQ#Why_is_0.3_-_0.2_-_0.1_.28or_similar.29_not_equal_to_zero.3F. – am304

+0

Спасибо. Я использовал преобразование uint8() в моей логике проверки, чтобы преобразовать его в целое число, а затем проверить его. Я уверен, что тогда все будет хорошо. – roni

+0

Я не мог понять ваш код. Где я могу объявить переменную count_nb? – roni

Смежные вопросы