42 views (last 30 days)

Show older comments

Hi. I have a matrix :

x = [ 6.5 7 23 24 25]

x =

6.5000 7.0000 23.0000 24.0000 25.0000

However, the numbers inside matrix x are not in the correct spots. I need to move some of them. In order to find out which ones to move, I have to look at another matrix which is called c and c equals to:

c = [ 1 2 3 4 5 ;

3 2 4 1 5]

c =

1 2 3 4 5

3 2 4 1 5

I want to write a code which can detect which columns in matrix c do not have the same numbers in its two rows. For example in matrix c the answer is 1st, 3rd, and 4th columns. Following is what I have done.

y = find(c(1,:)~=c(2,:));

Now this line of code helps me to find where in numbers do not match.

Now I want a code which can apply the findings of y to swap the values in matrix x.

In other words, the out put of the code that I am looking for should give me

J = blahblah(x);

J = [ 24 7 6.5 23 25];

This is very important and I have no clue how to do it.

Any help would be appreciated.

Roger Stafford
on 16 Nov 2016

If I understand the method in your example correctly, then using your definition of x and c, the following should accomplish the necessary transformation using matlab's 'circshift' function:

y = find(c(:,1)~=c(2,:));

J = x;

J(y) = J(circshift(y,1));

Walter Roberson
on 16 Nov 2016

If you have two indices, I, J, at which you need to swap, then

YourMatrix([I, J]) = YourMatrix([J, I]);

will do the swap.

If you indices are expressed through a row vector of length 2, y, then

YourMatrix(y) = YourMatrix(fliplr(y));

Use flipud if it is a row vector.

This will not work as well with length greater than 2: if your vector were an odd length then one of the elements would be set to itself.

Walter Roberson
on 16 Nov 2016

The question becomes how to match the source and destination.

The general syntax

YourMatrix(ListOfDestiantions) = Yourmatrix(ListOfCorrespodingSources);

reads everything from Yourmatrix(ListOfCorrespodingSources) before doing any assignments at YourMatrix(ListOfDestiantions), so it is safer than using

for K = 1 : length(ListOfCorrespodingSources)

YourMatrix(ListOfDestinations(K)) = YourMatrix(ListOfCorrespodingSources(K));

end

The "for" version of it messes up on swapping values.

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

Start Hunting!