MATLAB Answers

0

Random but unique values in matrix

Asad Abbas さんによって質問されました 2016 年 8 月 29 日
最新アクティビティ antlhem
さんによって 編集されました 2019 年 4 月 28 日
dpb
さんの 回答が採用されました
Please help me! I want to generate random but unique row as given in code. I want generate complete 100*13 matrix. When this code run it stuck after around 29th iterations. Please help me and give suggestions. If my question is not understandable please let me know. I will explain more in detail.
j=1;
pop_size=100;
V=13;
while j:pop_size
y=randi([0 1],j,V);
y(:,2)=~y(:,1);
y(:,3)=~y(:,4);
y(:,5)=~y(:,6);
y(:,12)=~y(:,13);
y = unique(y, 'rows');
j=size(y,1)+1;
end

  10 件のコメント

Asad Abbas 2016 年 8 月 29 日
Sir, I want generate 100*13 random matrix with 0 or 1 value and each row should be unique means no repetition should occur. I have given so me constraints also. These constraints are. For example column 1 should not be equal column 2. means if column 1 is 0 then column 2 should be 1. y(:,2)=~y(:,1); y(:,3)=~y(:,4); y(:,5)=~y(:,6); y(:,12)=~y(:,13);
Steven Lord
2016 年 8 月 29 日
So generate a random 100-by-8 matrix. Check if all its rows are unique using the unique function with the 'rows' flag. Once you have a suitable matrix, expand it to 12 columns. [Once columns 1, 3, 5, and 12 are fixed they determine columns 2, 4, 6, and 13.]
Stephen Cobeldick
2016 年 8 月 29 日
My answer exactly implements the concept that Steve Lord suggests.

サインイン to comment.

4 件の回答

dpb
回答者: dpb
2016 年 8 月 29 日
 採用された回答

>> z=randi([0 1],100,13); % Generate trial array
>> [u,ia,ib]=unique(z,'rows','stable'); % check for uniqueness between rows
>> length(ia) % dang!, one short...
ans =
99
>> find(ismember(z,z(setdiff([1:100],ia),:),'rows')) % locate which are the offending rows
ans =
34
92
>>
>> [z(34,:);z(92,:)] % indeed, they are identical...
ans =
0 0 1 0 0 1 1 0 1 0 1 0 0
0 0 1 0 0 1 1 0 1 0 1 0 0
>>
OK, NOW you can begin a loop looking to generate a new row that is different than z(34,:) and also not duplicate another already...

  2 件のコメント

Thorsten
2016 年 8 月 29 日
Or you generate a trial array with many more rows than actually needed and hope that you'll end up with more than 100 unique rows. See my answer below.
BTW: You forgot the ensure the four constraints
y(:,2)=~y(:,1);
y(:,3)=~y(:,4);
y(:,5)=~y(:,6);
y(:,12)=~y(:,13);
Asad Abbas 2016 年 8 月 29 日
Thank you so much Sir, Its working. I am so happy.

サインイン to comment.


Stephen Cobeldick
回答者: Stephen Cobeldick
2016 年 8 月 29 日
編集済み: Stephen Cobeldick
2016 年 8 月 29 日

A complete working example:
X = randi([0,1],100,9);
chk = true;
while chk
[~,idx] = unique(X,'rows');
idy = setdiff(1:100,idx);
X(idy,:) = randi([0,1],numel(idy),9);
chk = numel(idy)>0;
end
Y = X(:,[1,1,2,2,3,3,4:end,end]);
idz = [1,3,5,12];
Y(:,idz) = ~Y(:,1+idz);
and tested:
>> size(unique(Y,'rows'))
ans =
100 13
>> Y(:,1:2) % check that two columns are always different
ans =
0 1
1 0
1 0
1 0
0 1
1 0
1 0
1 0
0 1
1 0
1 0
etc
>> Y(:,12:13)
ans =
1 0
1 0
0 1
1 0
1 0
0 1
1 0
1 0
1 0
0 1
0 1
0 1
1 0
0 1
etc

  3 件のコメント

Asad Abbas 2016 年 8 月 29 日
Sir Its working exactly. thank you much.
Stephen Cobeldick
2016 年 8 月 29 日
@Asad Abbas: you can also vote for my answer, if it solves your task. That is an easy way for you to say "thank you" to us volunteers.
antlhem
2019 年 4 月 28 日
Hi Stephen Cobeldick, how would you suggest me to use this method in order to create a bigger array (1500x1500). With all the rows unique among each other?

サインイン to comment.


回答者: Ori Golani 2018 年 10 月 9 日

Hi all, I know that this is an old thread, but I found an efficient non-iterative solution for this.
Complete working example:
I= 2; % maximal integer in the matrix (values will be [0...I-1])
M= 3; % Matrix rows
N= 10; % matrix columns
word_indices= randperm(I^N,M);
matrix_in_char= dec2base(word_indices,I);
random_matrix= reshape(base2dec(matrix_in_char(:),I),M,N);
Tested:
random_matrix =
1 1 1 0 1 1 1 0 1 0
0 0 1 1 0 1 0 0 0 1
0 0 1 0 1 0 1 1 1 0

  2 件のコメント

Stephen Cobeldick
2018 年 10 月 9 日
+1 neat idea.
antlhem
2019 年 4 月 28 日
Hi Ori Golani, do you know how to create a bigger matrix with this method? I tested with M=N=1500, but is not passing this test. There is an error from MATLAB saying:
Error using randperm
N must be less than 2^53.
Any suggestions, to be able to create bigger random-unique matrix?

サインイン to comment.


Thorsten
回答者: Thorsten
2016 年 8 月 29 日
編集済み: Thorsten
2016 年 8 月 29 日

The trick is to get more rows then actually needed, like 2*pop_size. Then you'll get your y almost always in the first trial:
pop_size=100;
V=13;
trials = 1;
while 1
y = randi([0 1], 2*pop_size, V);
y(:,2)= 1- y(:,1);
y(:,3)= 1- y(:,4);
y(:,5)= 1- y(:,6);
y(:,12)= 1- y(:,13);
[yu, xi] = unique(y, 'rows');
if size(yu, 1) >= pop_size
y = y(xi(1:pop_size),:);
break;
else
trials = trials + 1;
end
end
% check
size(unique(y, 'rows'), 1)

  2 件のコメント

Asad Abbas 2016 年 8 月 29 日
Thank you so much for your response. But when I run this command at the end of your given code y=unique(y,'rows'); It is not giving 100*13 unique rows, It giving 89*13, 92*13 something like this.
Thorsten
2016 年 8 月 29 日
You're right. I corrected the code.

サインイン to comment.



Translated by