# Rearrange a given array

25 views (last 30 days)
luca on 16 Sep 2019
Commented: luca on 16 Sep 2019
Given a vector
V = [ 19 15 11 2 16 3 1 18 14 3 18 19 20 1 13 4 14 3 1 2 16 4 3 1 19 3 20 4 13 1 15 2 18 4 1 20 19 17 3 1 13 20 3 4 17 18 19 20 14 15 11 2]
I would like to rearrange V in this way.
every 10 element I want to collect the elements that are in the same column of A
A= [0 15 11 2 4 0 3 1 13;
14 0 16 0 0 0 0 0 0;
0 0 0 0 8 0 0 0 0;
0 0 18 0 0 0 0 0 0;
0 0 19 0 0 0 0 0 0;
0 0 0 0 0 0 0 0 0];
In this case, we want to collect 11,16,18,19 and also 4,8. Doesn't mind for the others that are just one in the columns, but if we have the same number I want to collect this two number together (see below with 3)
So for example, for the first 10 elements:
19 15 11 2 16 3 1 18 14 3
they will be rearrange as
19 11 16 18 15 2 3 3 1 14

Guillaume on 16 Sep 2019
Edited: Guillaume on 16 Sep 2019
This would work as long as V has a multiple of 10 elements:
%demo data
V = [ 19 15 11 2 16 3 1 18 14 3 18 19 20 1 13 4 14 3 1 2 16 4 3 1 19 3 20 4 13 1 15 2 18 4 1 20 19 17 3 1 13 20 3 4 17 18 19 20 14 15];
A= [0 15 11 2 4 0 3 1 13;
14 0 16 0 0 0 0 0 0;
0 0 0 0 8 0 0 0 0;
0 0 18 0 0 0 0 0 0;
0 0 19 0 0 0 0 0 0;
0 0 0 0 0 0 0 0 0];
assert(mod(numel(V), 10) == 0, 'V length is not a multiple of 10');
V10 = reshape(V, 10, []); %rearrange V in batches of 10
[~, where] = ismember(V10, A); %find location of elements in A
[~, col] = ind2sub(size(A), where); %convert location into column index
[~, order] = sort(col, 1); %and sort by column order
newV = reshape(V10(order + (0:size(order, 1):numel(order)-1)), 1, []) %and rearrange columns of V10 according to that order
Note that elements of V not found in A get reordered first in each group of 10.
luca on 16 Sep 2019

R2019a

### Community Treasure Hunt

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

Start Hunting!

Translated by