How to rotate rows of a matrix?

조회 수: 31(최근 30일)
Dominik Mattioli
Dominik Mattioli 2017년 2월 15일
답변: Guillaume 2017년 2월 15일
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))

Community Treasure Hunt

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

Start Hunting!

Translated by