general code for sorting inside cell

1 visualización (últimos 30 días)
NA
NA el 7 de Mzo. de 2019
Comentada: NA el 9 de Mzo. de 2019
ref=69;
A={[1,2,3,12],[19,34,37,15,33,35,36],[19,20,21,22,23,5,8,11,13,15,17],[37,38,65,40,42,49,66],[5,11,3,12],[69,19,21,22,23],[69,70,75]};
amount=[];
ref_include_index = cellfun(@(v)any(ismember(v,ref)),A);
ref_include_array = A(ref_include_index); % find array that include ref
amount=[ref_include_array{:},amount];
amount=unique(amount);
idv = cellfun(@(v)any(ismember(v,amount)),A);
idvv=A(idv&~ref_include_index);
amount=[idvv{:},amount];
amount=unique(amount);
idr = cellfun(@(v)any(ismember(v,amount)),A);
idrr=A(idr&~idv&~ref_include_index);
amount=[idrr{:},amount];
amount=unique(amount);
idm = cellfun(@(v)any(ismember(v,amount)),A);
idmm=A(idm&~idr&~idv&~ref_include_index);
amount=[idmm{:},amount];
amount=unique(amount);
result=[ref_include_array,idvv,idrr,idmm];
this code sorting A according to ref. if size of A is changing I have to copy and paste this line
idm = cellfun(@(v)any(ismember(v,amount)),A);
idmm=A(idm&~idr&~idv&~ref_include_index);
amount=[idmm{:},amount];
amount=unique(amount);
Is there any way to write better code for this?
  2 comentarios
Jan
Jan el 7 de Mzo. de 2019
Editada: Jan el 7 de Mzo. de 2019
You forgot to explain, what the code should do. "If size of A is changing" can mean, that A becomes empty or a {1000 x 200} cell array. So why do you have to add these 4 lines in this case?
I ran your code, but the purpose is not getting clear to me.
NA
NA el 7 de Mzo. de 2019
Editada: NA el 7 de Mzo. de 2019
I want to change order of cell A according to this:
As ref is 69, find all array that has 69 inside. ref_include_array=[69,19,21,22,23],[69,70,75]
find all array that have 19,21,22,23 and 70,75 inside (all element of ref_include_array except first element in array). idvv=[19,34,37,15,33,35,36],[19,20,21,22,23,5,8,11,13,15,17]
next step,find all array that have 34,37,15,33,35,36 and 20,21,22,23,5,8,11,13,15,17inside. idrr=[37,38,65,40,42,49,66],[5,11,3,12]
find all array that have 38,65,40,42,49,66 and 11,3,12. idmm=[1,2,3,12]
As in this example I do not have other array that contain 1,2,3 code should stop.
so the New_A order become. New_A={[69,19,21,22,23],[69,70,75], [19,34,37,15,33,35,36],[19,20,21,22,23,5,8,11,13,15,17],[37,38,65,40,42,49,66],[5,11,3,12],[1,2,3,12]}
"If size of A is changing" can mean, that A becomes empty or a {1000 x 200} cell array.
I mean length of A is changing.now, A is 1*7 cell, A become 1*90.
A does not become empty or a {1000 x 200} cell array.

Iniciar sesión para comentar.

Respuesta aceptada

Jan
Jan el 7 de Mzo. de 2019
Editada: Jan el 7 de Mzo. de 2019
ref = 69;
A = {[1,2,3,12],[19,34,37,15,33,35,36],[19,20,21,22,23,5,8,11,13,15,17], ...
[37,38,65,40,42,49,66],[5,11,3,12],[69,19,21,22,23],[69,70,75]};
Result = {};
while ~isempty(A) % As long as A is not empty:
% Find vectors, which contain any element of ref:
match = cellfun(@(a) any(ismember(a, ref)), A);
% Attach found vectors to the output:
Result = cat(2, Result, A(match));
% Find new reference vector:
ref = unique(cat(2, A{match}));
% Crop matched vectors from A:
A = A(~match);
end
  3 comentarios
Jan
Jan el 8 de Mzo. de 2019
Editada: Jan el 8 de Mzo. de 2019
Why not "sorting" the arrays before the processing?
A = {[1,2,3,12],[19,34,37,15,33,35,36],[19,20,21,22,23,5,8,11,13,15,17], ...
[37,38,65,40,42,49,66],[5,11,3,12],[69,19,21,22,23],[69,70,75],[17,31,32,113],[41,69]};
index_base={[1],[1],[1],[4],[4],[1],[1],[2],[2]};
for iA = 1:numel(A)
if index_base{iA} ~= 1
v = A{iA};
m = (1:numel(v)) == index_base{iA};
A{iA} = [v(m), v(~m)];
end
end
NA
NA el 9 de Mzo. de 2019
Thanks

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Shifting and Sorting Matrices en Help Center y File Exchange.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by