i have a 7*1 double matrix and need to reorder data to satisfy some condition.Thank you in advance.
example:
Let A = [10010 ; 11000 ; 01100 ; 01011 ; 10111 ; 11010 ; 01111]
output :
B = [10010 ; 11010 ; 11000 ; 01100 ; 01111 ; 01011 ; 10111]

5 Comments

"i have a 7*1 double matrix and need to reorder data to satisfy some condition"
And what exactly is that condition?
A = [1,0,0,1,0; 1,1,0,0,0; 1,1,0,1,0; 0,1,1,0,0; 0,1,0,1,1];
A * pow2(4:-1:0).'
ans = 5×1
18 24 26 12 11
B = [1,0,0,1,0; 1,1,0,1,0; 1,1,0,0,0; 0,1,0,1,1; 0,1,1,0,0];
B * pow2(4:-1:0).'
ans = 5×1
18 26 24 11 12
@Stephen23 thank you for your response and this is basically a binary representation and since i want the number of bit changes between consecutive pattern to be minimum and when totalled it will be least. previously i have sent the wrong data can you please solve the edited one above with actual 7*1 array. thank you in advance.
Stephen23
Stephen23 on 26 Feb 2023
Edited: Stephen23 on 26 Feb 2023
"since i want the number of bit changes between consecutive pattern to be minimum and when totalled it will be least."
Please give a precise mathematical description of how to calculate the "minimum" and also how to "total" them. There are many such norms that could be applied, I have no idea which one you want to use.
@Stephen23 sorry for the inconvenience, for example
A = [10010 ; 10111 ; 10011 ; 01011]
i want to reorder the above A into a set of elements B lets say
B = [10010 ; 10011 ; 10111 ; 01011]
here let me take first "two" elements
10010
10011 - as you can see only the last bit of both elements are different so will it as 1
10111 - only 1 bit difference (3rd bit different) so will take it as 1
01011 - 3 bits different so 3
so total bit changes are 1 + 1 + 3 = 5. (reordering is done to get total as least as possible)
but now my primary goal is to reorder the A set into B set as i have mentioned in question and given below. A set is shown as a 7 * 1 double in my matlab. so please provide a solution keeping in mind this condition.
example:
Let A = [10010 ; 11000 ; 01100 ; 01011 ; 10111 ; 11010 ; 01111]
output :
B = [10010 ; 11010 ; 11000 ; 01100 ; 01111 ; 01011 ; 10111].
thank you in advance.
This looks like a homework problem. Is it? If so, ask your instructor or read the link below to get started:
Obviously we can't give you the full solution because you're not allowed to turn in our code as your own.

Sign in to comment.

 Accepted Answer

Stephen23
Stephen23 on 26 Feb 2023
Edited: Stephen23 on 26 Feb 2023
This code finds all permutations with the minimum absolute difference as you specified here:
A = [1,0,0,1,0; 1,1,0,0,0; 0,1,1,0,0; 0,1,0,1,1; 1,0,1,1,1; 1,1,0,1,0; 0,1,1,1,1]
A = 7×5
1 0 0 1 0 1 1 0 0 0 0 1 1 0 0 0 1 0 1 1 1 0 1 1 1 1 1 0 1 0 0 1 1 1 1
P = perms(1:size(A,1));
N = Inf;
C = {};
for k = 1:size(P,1)
X = P(k,:);
M = sum(vecnorm(diff(A(X,:),1,1),1,1));
if M==N
C{end+1} = X;
elseif M<N
N = M;
C = {X};
end
end
display(C) % mimimum permutations
C = 1×4 cell array
{[5 1 6 2 3 7 4]} {[4 7 5 1 6 2 3]} {[4 7 3 2 6 1 5]} {[3 2 6 1 5 7 4]}
display(N) % total absolute difference
N = 9
for k = 1:numel(C)
A(C{k},:) % lets take a look at them
end
ans = 7×5
1 0 1 1 1 1 0 0 1 0 1 1 0 1 0 1 1 0 0 0 0 1 1 0 0 0 1 1 1 1 0 1 0 1 1
ans = 7×5
0 1 0 1 1 0 1 1 1 1 1 0 1 1 1 1 0 0 1 0 1 1 0 1 0 1 1 0 0 0 0 1 1 0 0
ans = 7×5
0 1 0 1 1 0 1 1 1 1 0 1 1 0 0 1 1 0 0 0 1 1 0 1 0 1 0 0 1 0 1 0 1 1 1
ans = 7×5
0 1 1 0 0 1 1 0 0 0 1 1 0 1 0 1 0 0 1 0 1 0 1 1 1 0 1 1 1 1 0 1 0 1 1
Your example output does not have the minimum according to the definition you gave. Its total is actually:
B = [1,0,0,1,0; 1,1,0,1,0; 1,1,0,0,0; 0,1,1,0,0; 0,1,1,1,1; 0,1,0,1,1; 1,0,1,1,1]
B = 7×5
1 0 0 1 0 1 1 0 1 0 1 1 0 0 0 0 1 1 0 0 0 1 1 1 1 0 1 0 1 1 1 0 1 1 1
sum(vecnorm(diff(B,1,1),1,1))
ans = 10

2 Comments

In contrast your first example here does provide (one of) the correct result:
A = [1,0,0,1,0; 1,0,1,1,1; 1,0,0,1,1; 0,1,0,1,1];
P = perms(1:size(A,1));
N = Inf;
C = {};
for k = 1:size(P,1)
X = P(k,:);
M = sum(vecnorm(diff(A(X,:),1,1),1,1));
if M==N
C{end+1} = X;
elseif M<N
N = M;
C = {X};
end
end
N
N = 5
C
C = 1×8 cell array
{[4 3 2 1]} {[4 3 1 2]} {[4 2 3 1]} {[4 1 3 2]} {[2 3 1 4]} {[2 1 3 4]} {[1 3 2 4]} {[1 2 3 4]}
B = [1,0,0,1,0; 1,0,0,1,1; 1,0,1,1,1; 0,1,0,1,1];
sum(vecnorm(diff(B,1,1),1,1))
ans = 5
It happens to be the 7th permutation found with that total:
Z = cellfun(@(x)isequal(B,A(x,:)),C)
Z = 1×8 logical array
0 0 0 0 0 0 1 0
isequal(B,A(C{7},:))
ans = logical
1
@Stephen23 thank you for your response. really helpful

Sign in to comment.

More Answers (1)

Askic V
Askic V on 25 Feb 2023
Edited: Askic V on 25 Feb 2023
It seems to me that you want this logic implemented:
A = ["10010" ; "11000" ; "11010" ; "01100" ; "01011"]
A = 5×1 string array
"10010" "11000" "11010" "01100" "01011"
N = numel(A);
B = A;
for i = N:-2:2
B([i,i-1]) = B([i-1,i]);
end
B
B = 5×1 string array
"10010" "11010" "11000" "01011" "01100"

1 Comment

@Askic V thank you for your response and by mistake previously i have sent the wrong data and can you please solve the edited one above. thank you in advance

Sign in to comment.

Categories

Products

Release

R2020a

Community Treasure Hunt

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

Start Hunting!