2010-03-30 3 views
3

매우 낮은 값에서부터 매우 낮은 값까지 1s의 농도 (또는, simmetrically, 0s)의 크기 N의 임의의 이진 벡터의 수 X를 생성하는 가장 좋은 방법은 무엇입니까? 매우 높았습니까?Matlab - 1s (또는 0s)의 고농도를 가진 이진 벡터

randint 또는 unidrnd (this question과 같이)를 사용하면 균일 한 분포를 가진 이진 벡터가 생성됩니다.이 경우에는 내가 필요로하지 않습니다.

도움을 주셨습니다.

+1

농도가 "매우 낮음에서 매우 높음"까지라고 할 때 무엇을 의미합니까?이것은 당신이 계산하는 각각의 벡터가 마지막 벡터보다 더 많은 (또는 0)을 가지거나, 1 또는 0의 농도가 벡터의 한쪽 끝에서 다른 쪽 끝까지 커진다는 것을 의미합니까? – gnovice

+0

나는 고농축의 1s 벡터를 필요로하지만 매우 낮은 1s 농도를 갖는 벡터가 필요하다는 것을 의미한다. 매우 높은 것부터 매우 낮은 것까지 – JohnIdol

답변

6

Laserallan의 방법이 최선의 방법입니다. 당신은 사람의 양을 증가와 함께, 길이 N의 X 벡터를 원하는 경우 10 개 요소와 무작위로 배포되는 70 %의 사람과 벡터를 들어

, 당신은

randVec = rand(10,1)<0.7; 

편집 쓰기, 당신은

쓰기
thresVec = linspace(0,1,X); %# thresholds go from 0 (all 0) to 1 (all 1) 
randVec = bsxfun(@lt,rand(N,X),threshVec); %# vectors are per column 

randVec은 논리적 배열입니다. 당신이 그것으로 수행 할 작업에 따라, 당신은 너무

randVec = double(randVec); 
+0

1의 양이 증가하는 솔루션은 조나 스 - tnx가 도움이 될 것입니다! – JohnIdol

1

균일하게 분포 된 바이너리 벡터에 대해 비트 연산이나 연산을 사용할 수 있습니다. 최종 배포본이 조금 복잡해 졌을 것으로 생각됩니다.

+0

좋은 직감처럼 들린다. 인접한 비트 사이의 연산? 고밀도 규칙 (1과 0 모두에 대해)이 많으면 OR (OR)을 사용하여 균일 한 분포로 대부분 1s를 얻을 것이라고 생각합니다. 인구의 1/3에서 OR을 실행할 수 있고, 나머지 세 번째 AND는 나머지를 남겨 둘 수 있습니까? :) – JohnIdol

+1

예를 들어, 75 % 1로 숫자를 만들면 (예를 들어, 62.5 % 1을 얻으려면 세 번째 독립적 인 유니폼을 사용하면됩니다.) 두 개의 독립된 균일 한 분포를 생각하고있었습니다. 일종의 이진 탐색 접근법을 사용하여 합리적으로 직설적으로 모든 밀도를 생성 할 수 있어야합니다. 원본 값이 실제로 균일하게 분포하지는 않지만이 방법은 상당히 불안정 할 수 있습니다. – James

3

저는 matlab에 대한 전문가가 아니지만 구현이 매우 간단해야하는 접근법은 부동 소수점 난수 벡터 (1에서 0 범위가 바람직 함)를 생성 한 다음 특정 임계 값보다 큰 값을 1 이하로 설정하는 것입니다. 30 %를 원하는 경우, .7을 1 이상으로 설정하고 아래 값을 0으로 설정한다고 가정 해 보겠습니다.

+0

그 점은 고/저밀도 분포가 무작위 적으로 분포하고 싶다는 것입니다. – JohnIdol

+1

x의 함수로 위와 아래의 분포를 표현할 수있는 경우 x는 특정 요소의 인덱스입니다. 벡터에서 위치 x의 값을 1 또는 0으로할지 여부를 선택하기위한 임계 값으로 사용할 수 있습니다. – Laserallan

2

평균 N * P는 사람에 당신에게 NX1 벡터를 줄 것이다

rand(N,1)<p %# 0 < p < 1 

를 사용하여 같은 두배로 변환 할 수 있습니다 (그리고 다른 곳은 0이 될 것입니다.) - 어떤 실행에서는 예상했던 것과 다른 벡터를 얻을 수 있습니다 (예를 들어 모두 0 일 수도 있습니다 ... 아주 낮은 기회 일 수 있지만 여전히 0이 아닌 확률). 당신이 정확히 것들과 B의 0을 원하는 경우

, 당신은이 작업을 수행 할 수 있습니다

rand_vec = [ones(A, 1); zeros(B, 1)]; 
rand_vec = rand_vec(randperm(A+B)); 

그런 다음 당신은을 설정하고 B는 사용자의 요구에 맞게.

편집 :
가 지금은 더 나은 귀하의 질문에 이해 : 당신이 당신의 인구 1 개의의 원하는 비율을 포함하는 벡터 P가 있다고 가정하자를, N은 각 벡터의 요소 수입니다.

rand_mat = rand(N, size(p,2)) < repmat(p', [1,N])'; 

당신에게 Nx를 (크기 (페이지 2)) 줄 것이다 (위에서 설명한대로 평균) 나머지는 제로입니다 열 내가 P (내가) 사람과 벡터이다 행렬.

관련 문제