2013-02-22 3 views
1

미리 정의 된 크기의 행렬에 임의의 반복되지 않는 좌표 집합 목록 (크기 n)을 만들어야합니다.Matlab - 행렬의 랜덤 좌표 생성

Matlab에서이를 생성하는 빠른 방법이 있습니까?

초기 생각은 (너비 x 길이) 크기의 순열을 사용하여 크기 n의 목록을 작성한 다음 행 및 열 값으로 다시 변환하는 것이었지만 너무 많이 보였다.

감사합니다, 가이

+0

'n'이 매트릭스의 요소 수보다 큰 경우 어떻게됩니까? 그런 다음 반복을 허용 할 수 있습니까? – slayton

+0

프로젝트를 git에 업로드했습니다 : https://github.com/guywald/allele_fixation –

답변

3
당신은 선형 인덱스를 생성하는 randperm를 사용하여 변환 할 수 있습니다

to [row, col]로 변경하십시오. ind2sub. 당신도 행 및 COL 지수에 다시 선형 인덱스를 변환 할 필요는 없지만

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

당신의 생각은, 좋은, 당신은 직접 2 차원 배열로 선형 인덱싱을 할 수 있습니다.

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 내가 맞다고 가정 할 때, OP는 다른 목적으로 좌표를 생성하는 것과는 대조적으로 OP가 색인 체계를 찾고 있다고 생각했습니다. 이 대답을 삭제해야합니까? – alrikai

+0

meh, 그 나쁜 대답은 내가 그것을 유지하지 않을거야. – slayton