How to rotate rows of a matrix?

20 次查看(过去 30 天)
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];

采纳的回答

Roger Stafford
Roger Stafford 2017-2-15
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

更多回答(2 个)

Image Analyst
Image Analyst 2017-2-15
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 个评论
Dominik Mattioli
Dominik Mattioli 2017-2-15
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?

请先登录,再进行评论。


Guillaume
Guillaume 2017-2-15
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))

类别

Help CenterFile Exchange 中查找有关 Operating on Diagonal Matrices 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by