2017-07-20 5 views
0

in Matlab Betrachten Sie die Zelle data wie folgt aufgebautFinding Indizes in einer Matlab Zelle

clear all 
Mrange=[2;4;3]; 
Mtot=sum(Mrange,1); 
Nrange=[3;5;1]; 
Nsize=size(Nrange,1); %size(Nrange,1)=size(Mrange,1) by construction 

data=cell(Nsize,1); 
positions=cumsum(Mrange); 
for n=1:Nsize 
    if n==1  
     data{n} = kron((1 : 1 : Mrange(n))',ones(Nrange(n),1)); 
    else 
     data{n} = kron((positions(n-1)+1 : 1 : positions(n-1)+Mrange(n))',ones(Nrange(n),1)); 
    end 
end 

%In short 
%data{1} is a vector of dimension 2x3 listing [1;1;1;2;2;2] 
%(2 blocks as indicated by Mrange(1) with each number repeated 3 times as indicated by Nrange(1)) 

%data{2} is a vector of dimension 4x5 listing [3;3;3;3;3;4;4;4;4;4;5;5;5;5;5;6;6;6;6;6] 
%(4 blocks as indicated by Mrange(2) with each number repeated 5 times as indicated by Nrange(2)) 

%data{3} is a vector of dimension 2x3 listing [7;8;9] 
%(3 blocks as indicated by Mrange(3) with each number repeated once as indicated by Nrange(3)) 

jetzt Angenommen, ich Mtot Zufallszahlen zwischen 1 und Mtot

%Just for reproducibility suppose 
indices=[2;2;1;9;8;7;2;7;1]; 

Frage ziehen: Ich möchte Konstruieren Sie eine Zelle indicesnew der Dimension Nsizex1 Berichterstattung für n=1,...,Nsize t er nummeriert in indices enthalten in data{n} in der Reihenfolge, in der sie in indices erscheinen.

Daher

%indicesnew{1}=[2;2;1;2;1] 
%indicesnew{2}=[] 
%indicesnew{3}=[9;8;7;7] 

Dieser Code tut, was ich will

indicesnew=cell(Nsize,1); 
for m=1:Mtot 
    for n=1:Nsize 
     if ismember(indices(m),data{n})==1 
      indicesnewtemp=indicesnew{n}; 
      indicesnew{n}=[indicesnewtemp; indices(m)]; 
     end 
    end 
end 

Könnten Sie eine effizientere Version vorschlagen, möglicherweise ohne Schleifen?

Antwort

1

Während cellfun nur eine interne For-Schleife ist, wird dies eine Ihrer Schleifen entfernen und Ihren Code viel lesbarer machen. Als ich die Laufzeit (mit 10000 Loops und tic - toc) auf einem Linux Ubuntu Computer getestet habe, lief es auch wesentlich schneller.

indicesnew = cellfun(@(x,y) {y(ismember(y,x))}, data, repmat({indices},3,1)); 
Verwandte Themen