Effacer les filtres
Effacer les filtres

How to rotate rows of a matrix?

20 vues (au cours des 30 derniers jours)
Dominik Mattioli
Dominik Mattioli le 15 Fév 2017
I have a matrix A where each row of A has only one value of 1 and the rest are some other number.
A = [9 8 7 1; 9 1 8 7; 9 8 1 7; 9 1 8 7; 9 8 7 1; 1 9 8 7]
How can I rotate all of the rows individually such that the 1 value is in the first column of each row in the resultant matrix? How about the second column? I'd like to do this without a for-loop because I am working with large matrices.
%%% Result:
% First column.
B = [1 9 8 7; 1 8 7 9; 1 7 9 8; 1 8 7 9; 1 9 8 7; 1 9 8 7];
% Second column.
C = [7 1 9 8; 9 1 8 7; 8 1 7 9; 9 1 8 7; 7 1 9 8; 7 1 9 8];

Réponse acceptée

Roger Stafford
Roger Stafford le 15 Fév 2017
I think a for-loop is your best bet:
for k = 1:size(A,1)
f = find(A(k,:)==1,1);
A(k,:) = circshift(A(k,:),1-f);
end

Plus de réponses (2)

Image Analyst
Image Analyst le 15 Fév 2017
Try this:
A = [1 0 0 0; 0 1 0 0; 0 0 1 0; 0 1 0 0; 0 0 0 1; 0 0 1 0];
desiredColumn = 1; % or 2 or whatever
output = zeros(size(A)); % Initialize
output(:, desiredColumn) = 1 % Assign desired column to all ones.
  1 commentaire
Dominik Mattioli
Dominik Mattioli le 15 Fév 2017
Eek, I edited this just after I posted it, I'm sorry. I forgot to add that the order of each row is important. Do you know how to do that too?

Connectez-vous pour commenter.


Guillaume
Guillaume le 15 Fév 2017
A version without loop. Not sure it'd be faster than Roger's answer:
destcol = 1; %column where the 1 must be located
[c, r] = find(A' == 1);
A(sub2ind(size(A), repmat(r, 1, size(A, 2)), mod((1:size(A, 2)) + c - 1 - destcol, size(A, 2)) + 1))

Catégories

En savoir plus sur Operating on Diagonal Matrices dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by