2016-04-30 4 views
0

I'have функцию MapReduce, выход которого должен быть подан в другую функцию MapReduce код следующимКак передать параметр функции отображения во время вызова функции mapreduce?

function clustering = parallel_clustering_kmeans(data) 
%% find first clustering from all chunks 
result = mapreduce(data,@k_means_Mapper,@k_means_Reducer); 
result = readall(result); 
index = result{:,1}; 
index = cell2mat(cellfun(@str2num,strrep(index,',',' '),'un',0)); 
clustering = mapreduce(data,@k_means_Mapper_second,@k_means_Reducer); 
end 

Первая функция работает хорошо результат = MapReduce (данные, @ k_means_Mapper, @ k_means_Reducer); однако, я хочу передать индекс в качестве параметра для k_means_Mapper_second

Код должен быть следующим

function k_means_Mapper_second(data,index,intermidiateValuesOut) 
distance = zeros(size(data,1),size(index,1)); 
parfor i = 1:size(data,1) 
    for j = 1:size(index,1) 
     distance(i,j) = sum((data(i,:)-index(j,:)).^2).^0.5; 
    end 
end 
for i = 1:size(distance,1) 
    x = distance(i,:); 
    [~,ind] = min(x); 
    key = combine_values(data(i,:)); 
    addmulti(intermidiateValuesOut,key,ind); 
end 
end 

Мой вопрос, как я могу передать индекс в качестве параметра функции k_means_Mapper_second в последняя линия

clustering = mapreduce(data,@k_means_Mapper_second,@k_means_Reducer); 

заранее спасибо

+0

Использования [анонимная функция] (http://uk.mathworks.com/help/matlab/matlab_prog/anonymous-functions.html). –

ответ

2

Вам необходимо обернуть функцию внутри анонимной функции, которые принимают s все входы, данные ему mapreduce, но затем вызывает вашу функцию, передавая только соответствующие значения. В вашем случае это будет выглядеть примерно так:

mapperFunc = @(data, info, interim)k_means_Mapper_second(data, index, interim); 
clustering = mapreduce(data, mapperFunc, @k_means_Reducer); 
Смежные вопросы