フィルターのクリア

how to randomly shuffle the row elements of a predefined matrix??

216 ビュー (過去 30 日間)
Suvra Vijay
Suvra Vijay 2017 年 2 月 14 日
回答済み: Sandip 2023 年 10 月 15 日
i have a matrix , a= [1 2 4 6; 5 8 6 3;4 7 9 1] i want to randomly shuffle the elements of each row. how to do it?? please help

採用された回答

KSSV
KSSV 2017 年 2 月 14 日
a= [1 2 4 6; 5 8 6 3;4 7 9 1] ;
[m,n] = size(a) ;
idx = randperm(n) ;
b = a ;
b(1,idx) = a(1,:) % first row arranged randomly
  8 件のコメント
Bruno Luong
Bruno Luong 2022 年 4 月 24 日
@Hamza Shami it shuffle randomly assignmet of columns of a to b
Hamza Shami
Hamza Shami 2022 年 4 月 24 日
@Bruno Luong yea got it, thanks

サインインしてコメントする。

その他の回答 (5 件)

Tony Richardson
Tony Richardson 2020 年 1 月 22 日
Perhaps not very efficient, but uses only built-in functions and randomizes all elements of all columns:
a = [1 2 4 6; 5 8 6 3;4 7 9 1]
[m, n] = size(a);
[~, idx] = sort(rand(m,n));
b = a(sub2ind([m, n], idx, ones(m,1)*(1:n)))
  3 件のコメント
Tony Richardson
Tony Richardson 2021 年 1 月 11 日
You can recover the original a matrix with (here c will equal a):
c = ones(size(b));
c(sub2ind([m, n], idx, ones(m,1)*(1:n))) = b
I expect that you want the reverse indexing to go back from b to a, though. This seems to do that (here d will be equal to a):
[~, rdx] = sort(idx);
d = b(sub2ind([m, n], rdx, ones(m,1)*(1:n)))
munazah lyle
munazah lyle 2021 年 2 月 8 日
Thank you

サインインしてコメントする。


Jan
Jan 2017 年 2 月 14 日
If you have a C compliler installed, you can try https://www.mathworks.com/matlabcentral/fileexchange/27076-shuffle:
a = [1, 2, 4, 6; 5, 8, 6, 3; 4, 7, 9, 1];
b = Shuffle(a, 2)
  2 件のコメント
Suvra Vijay
Suvra Vijay 2017 年 2 月 14 日
thank you sir, but I don't have C compiler installed and this 'Shuffle' is not working
Jan
Jan 2017 年 2 月 14 日
While I'm sure, that this Shuffle is working (I've tried it some minutes ago), it requires to be compiled at first.

サインインしてコメントする。


Nikolay Petrov
Nikolay Petrov 2022 年 2 月 22 日
編集済み: Nikolay Petrov 2022 年 2 月 22 日
Not sure why this was more complicated to find that it should have been.
a = [1, 2, 4, 6; 5, 8, 6, 3; 4, 7, 9, 1];
a(:, randperm(size(a, 2)))
ans = 3×4
6 4 1 2 3 6 5 8 1 9 4 7
shuffles the elements of each row in the matrix, while
a = [1, 2, 4, 6; 5, 8, 6, 3; 4, 7, 9, 1];
a(randperm(size(a, 1)), :)
ans = 3×4
5 8 6 3 1 2 4 6 4 7 9 1
shuffle the elements of each column in the matrix.
  1 件のコメント
Tony Richardson
Tony Richardson 2022 年 2 月 22 日
These do the same rearrangement in all rows or columns. Perhaps that is what the original poster wanted. I am not sure. I interpret it as asking for each column (or row) to be shuffled independently of the others.

サインインしてコメントする。


Tony Richardson
Tony Richardson 2020 年 1 月 24 日
As a variation of my answer above, I'll note that if you want to generate M permutations of N objects (where the N objects are represented by the integers 1-N) you can use:
[~, x] = sort(rand(N, M));
I can generate 100,000 permutations of 52 objects in 0.3 seconds on my machine.
The probability of drawing 3 aces in a 5 card draw can be estimated (using 100,000 dealt hands):
%%%%%%%%%%%%%%%%%
M = 100000; % Number of trials
N = 52; % Number of cards in deck
[~, x] = sort(rand(N, M)); % columns of x are shuffled decks (100,000 shuffled decks)
y = x(1:5,:); % columns of y are the 5 card hands
% N3a is the number of hands containing three Aces out of M (100,000) deals
% I let Aces be cards 1, 14, 27, and 40 (1-13 is one suit, 14-26 is another, etc)
N3a = sum(sum(or(y == 1, y == 14, y == 27, y == 40)) == 3);
P3a = N3a/M
%%%%%%%%%%%%%%%%%
Successive runs of the script gives values of 0.00181, 0.00185, 0.00189, 0.00171.
The theoretical value is 0.001736
  3 件のコメント
Tony Richardson
Tony Richardson 2021 年 1 月 11 日
To go from the shuffled decks (x) back to the unshuffled decks (z):
z = sort(x)
This would just give a matrix whose columns go from 1-52 in order.
Again, I expect what you want is really the reverse index matrix (rdx), to get that and then recover the unshuffled decks from the shuffled ones:
[~, rdx] = sort(idx);
o = idx(sub2ind([m, n], rdx, ones(m,1)*(1:n)))
rdx would be the reverse indexing matrix. The matrix o would be the unshuffled deck (the same as the matrix z above).
munazah lyle
munazah lyle 2021 年 2 月 8 日

サインインしてコメントする。


Sandip
Sandip 2023 年 10 月 15 日
a_random = a(randperm(size(a, 1)), :);

カテゴリ

Help Center および File ExchangeResizing and Reshaping Matrices についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by