Auto fill zero matrix without row-repetitions

2 views (last 30 days)
Please help. I'm new to matlab scripting and need a bit of help. I have a series of numbers: test = [1 1 1 2 2 2 3 3 3 4 4 4 5 5 5] which I wants to randomely fill into a 5x3 matrix without having the same number in the same row. How can I do this??? Potentially I could randomize the test vector and fill it into the 5x3 matrix but I dont know how to do this without getting the same number in the same row. PLEASE help...
  1 Comment
JB
JB on 5 Jun 2017
MISTAKE, I want the final matrix to be a 3x5 matrix and not a 5x3 matrix...

Sign in to comment.

Accepted Answer

JB
JB on 5 Jun 2017
Thanks a lot for your suggestions. However, I made a minor mistake. I want the final matrix to be a 3x5 instead of a 5x3 matrix. Sorry guys, but I still need a bit of help to establish the correct code.
  3 Comments
JB
JB on 5 Jun 2017
Awesome, thanks KSSV. I have one final question for you which I hope you can help me with. Say test = [1 1 1 2 2 2 3 3 3] and I want to fill it into a 3x5 matix without row repetionen, and leave excess cells blank (or =) how is this done?
KSSV
KSSV on 5 Jun 2017
test = [1 1 1 2 2 2 3 3 3] ;
A = NaN(3,5) ;
test_unique = unique(test) ;
for i = 1:3
idx = randperm(3) ;
A(i,randperm(5,3)) = test_unique(idx) ;
end

Sign in to comment.

More Answers (2)

KSSV
KSSV on 5 Jun 2017
You can take the unique matrix of test and pick any three elements out of it and fill in the required 5X3 matrix.
test = [1 1 1 2 2 2 3 3 3 4 4 4 5 5 5] ;
test_unique = unique(test) ;
A = zeros(5,3) ;
for i = 1:size(A,1)
A(i,:) = randsample(test_unique,3) ;
end
randsample needs a statistics toolbox, if you doesn't have it, you may use randperm as shown below.
test = [1 1 1 2 2 2 3 3 3 4 4 4 5 5 5] ;
test_unique = unique(test) ;
A = zeros(5,3) ;
for i = 1:size(A,1)
A(i,:) = test_unique(randperm(length(test_unique),3)) ;
end
  3 Comments
KSSV
KSSV on 5 Jun 2017
You mean to say element might repeat in a row?
Walter Roberson
Walter Roberson on 5 Jun 2017
Elements cannot repeat in any row, but all elements of T must be placed in the 5 x 3 matrix.
Your code prevents elements from repeating in any one row, but the number of copies of any given member of T is not the same as the original. For example your code could randomly create
[1 2 3
1 2 3
1 2 3
1 2 3
1 2 3]
with no 4 or 5 anywhere.

Sign in to comment.


Andrei Bobrov
Andrei Bobrov on 5 Jun 2017
Edited: Andrei Bobrov on 5 Jun 2017
m = 5;
n = 3;
A = reshape(test,n,m)';
out = A(bsxfun(@plus,hankel(1:m,[m,1:n-1]),m*(0:n-1)));
out = out(randperm(m),:);
out = out(:,randperm(n));
ADD
m = 5;
n = 3;
test = repelem(1:3,3);
A = nan(n,m);
A(1:numel(test)) = test;
[~,ii] = sort(rand(n,m),2);
out = A(bsxfun(@plus,n*(ii-1),(1:n)'));
  4 Comments
JB
JB on 5 Jun 2017
Awesome, thanks Andrei. I have one final question for you which I hope you can help me with. Say test = [1 1 1 2 2 2 3 3 3] and I want to fill it into a 3x5 matix without row repetionen, and leave excess cells blank (or =) how is this done?

Sign in to comment.

Products

Community Treasure Hunt

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

Start Hunting!