Shuffle matrix rows so that common elements are in completely different order than in a said row
조회 수: 3 (최근 30일)
이전 댓글 표시
Say we have a matrix row 'current_row'
1 2 3
and a matrix A
1 2 5
1 3 6
2 4 3
The task is to re-arrange matrix A so that the common elements with 'current:_row' in each row are in compelely different indices.
One solution would be:
5 1 2
6 3 1
2 3 4
So that
for i=1:size(A,1)
find(current_row == A(i,:))
end
gives always three []'s
댓글 수: 2
채택된 답변
Matt J
2019년 4월 26일
편집: Matt J
2019년 4월 26일
Here is a vectorized implementation of what John described.
[m,n]=size(A);
I=repmat((1:m).',1,n);
B=A; %copy for shuffling
pool=find(any(B==current_row,2));
while ~isempty(pool)
p=numel(pool);
[~,J]=sort(rand(p,n),2);
B(pool,:)=B( sub2ind([m,n], I(pool,:), J) ); %shuffle rows in 'pool'
pool=find(any(B==current_row,2)); %narrow the search
end
result=Anew;
댓글 수: 0
추가 답변 (1개)
John D'Errico
2019년 4월 26일
What you are looking for is a variation of derangement - thus a permutation such that no element is in the same location as it started.
A simple solution? Just continue to shuffle each other row until it meets the goal, that no common elements are in the same location as they are in current_row. Stop when it does, and then go on to the next row. WTP?
You can probably improve on that scheme a bit, by finding the elements in common between the two rows. Then first permute them into ANY locations, as long as they are not the same as the current_row. Having done that derangement operation, then permute the other elements into any random permutation.
참고 항목
카테고리
Help Center 및 File Exchange에서 Scatter Plots에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!