2013-02-22 5 views
1

Мне нужно создать список (размера n) случайного, не повторяющегося набора координат на матрице предопределенного размера.Matlab - Генерирование случайных координат для матрицы

Есть ли быстрый способ создать это в Matlab?

Моя первоначальная идея состояла в том, чтобы создать список размером n с перестановками размером (ширина x длина) и перевести их обратно в значения Row и Col, но это мне кажется слишком большим.

Спасибо, Guy

+0

Что произойдет, если 'n' больше числа элементов в матрице? Возможны ли повторы? – slayton

+0

Я загрузил проект в git: https://github.com/guywald/allele_fixation –

ответ

3

Вы можете использовать randperm для создания линейного индекса, и преобразовать его [row, col] при необходимости с использованием ind2sub.

x = rand(7,9); 
n = 20; 
ndx = randperm(numel(x), n); 
[row,col] = ind2sub(size(x), ndx); 
2

Пока n меньше, чем количество элементов в матрице проста:

% A is the matrix to be sampled 
% N is the number of coordinate pairs you want 
numInMat = numel(A); 

% sample from 1:N without replacement 
ind = randperm(numInMat, N); 

% convert ind to Row,Col pairs 
[r, c] = ind2sub(size(A), ind) 
0

Ваша идея хорошая, хотя вы даже не должны преобразовывать линейные индексы обратно к строке и индексы Col, вы можете сделать линейную индексацию непосредственно в 2D-массив.

idx = randperm(prod(size(data))) 

где данные - ваша матрица. Это создаст вектор случайных чисел от 1 до prod(size(data)), то есть один индекс для каждого элемента.

например.

n = 3; 
data = magic(n); 
idx = randperm(prod(size(data))); 
reshape(data(idx), size(data)) %this gives you your randomly indexed data matrix back 
+0

', хотя вам даже не нужно преобразовывать ваши линейные индексы обратно в индексы строк и столбцов', поэтому OP специально попросил способ генерировать координаты, а не линейные индексы – slayton

+0

@slayton Я полагаю, вы правы, я понял, что ОП просто ищет схему индексирования, а не пытается создать координаты для какой-либо другой цели. Удалить этот ответ? – alrikai

+0

meh, это не плохой ответ, я бы сохранил его – slayton