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

Learn moreOpportunities for recent engineering grads.

Apply Today
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.

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

## 0 Comments