Asked by Lorenz
on 10 Apr 2013

Hello, How can I generate a Matrix (size 4x4) with random different figures from 1 to 4 ? Figures must be different in the lines and the columns. in example:

A=[1 2 3 4; 2 1 4 3; 3 4 1 2; 4 3 2 1]

thank you.

*No products are associated with this question.*

Answer by Jan Simon
on 10 Apr 2013

Edited by Jan Simon
on 10 Apr 2013

Accepted answer

You can start with a valid matrix:

A = [1:4; 1:4, 1:4, 1:4];

Then perform only operations, which do not destroy the validity: Interchange rows and columns in pairs:

for k = 1:1000 index = randperm(4, 2); % older Matlab versions accept 1 input only A(index(1), :) = A(index(2), :); index = randperm(4, 2); A(:, index(1)) = A(:, index(2)); end

Or a constructive method which rejects not matching input:

A = zeros(4, 4); A(1, :) = randperm(4, 4); index = 2; while index <= 4 newRow = randperm(4, 4); match = bsxfun(@ne, A(1:index - 1, :), newRow); if all(match(:)) A(index, :) = newRow; index = index + 1; end end

Actually trivial ideas with just some tricks in the implementation.

Lorenz
on 10 Apr 2013

Thank you, the second method works correctly.

Answer by Andrei Bobrov
on 10 Apr 2013

Edited by Andrei Bobrov
on 17 Apr 2013

n = 4; A = rem(bsxfun(@plus,1:n,(0:n-1)')-1,n)+1;

or [EDIT]

A = hankel(1:n,[n 1:n-1]); A = A(randperm(n),:); A = A(:,rendperm(n));

Lorenz
on 17 Apr 2013

Hi, thank you for your answer. How can I now permute the whole rows and whole columns in the order I want? For example row 2 goes to 3 and 3 to 2 and 1 goes to 4 and 4 to 1. The same for the columns.

fliplr, permute, flimud are not very efficient. thank you

Andrei Bobrov
on 17 Apr 2013

see EDIT

Related Content

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn moreOpportunities for recent engineering grads.

Apply Today
## 0 Comments