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?