Auto fill zero matrix without row-repetitions

3 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.

Categories

Find more on Creating and Concatenating Matrices in Help Center and File Exchange

Products

Community Treasure Hunt

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

Start Hunting!