2012-04-24 3 views
2

Matlab에서 분포 N (u, diag (sigma_1^2, ..., sigma_n^2))을 사용하여 n-dim 일반 난수를 생성한다고 가정합니다. 수직 벡터.matlab에서 공분산이 0 인 다 변수 일반 난수 생성하기

두 가지 방법이 있습니다.

randn(n,1).*[sigma_1, ..., sigma_n]' + u; 

mvnrnd(u', diag(sigma_1^2, ..., sigma_n^2))'; 

나는 때문에,이 질문을? 나는 그들이 모두 올바른 생각한다. 그러나 나는 몇 가지 이유에 따라 다른 통해 하나의 선호도를이 궁금해 다른 사람이 항상 첫 번째 방법을 선택하는 것을 보았습니다. 두 번째 방법은 아직 생각하지 않고 두 번째 방법을 선택했습니다.

감사합니다.

+1

'mvnrnd'가 통계 도구 상자에 있고'randn'이 아닙니다. 도구 상자 호환성에 대해 걱정하고 나서'randn'을 사용하십시오. – Richante

답변

2

이들은 동일한 방법입니다. 개인적으로는 두 번째 옵션을 선호합니다. 임의적으로 모양이 지정된 배열에 대해 이러한 종류의 데이터를 생성하는 데 사용할 수있는 함수이기 때문입니다. 갑자기 전체 가우스 값 행렬이 필요하다면 reshape()을 호출하지 않고 두 번째 함수 호출에서 더 쉽게 얻을 수 있습니다. 또한 두 번째 예제는 오랫동안 유비 쿼터스 인 Matlab의 내장 함수에 의존하기 때문에 읽기가 더 쉽다고 생각합니다.

n이 큰 경우 실제로는 diag(sigma_1^2, ..., sigma_n^2)을 형성하는 것이 비효율적이라고 주장 할 수 있습니다. 하지만 그 매트릭스에서 무작위 추출을해야한다면, Matlab은 이미 그 작업을위한 잘못된 툴이며 C++에서 Boost :: Probability를 사용하거나 Python에서 SciPy/scikits.stats 모델을 사용해야합니다.

2

임의 변수 사이에 상관 관계가있는 경우 공분산 행렬은 더 이상 대각 적이 지 않습니다. 이 경우 mvnrnd을 사용하거나 다음과 같이 Cholesky 디 컴파일을 사용하여 randn을 사용할 수 있습니다.

U = chol(SIGMA); 
x = U'*randn(n,1); 

가능한 경우 도구 상자 기능을 사용하는 대신 기본 기능을 사용하십시오. 기본 기능은 더 빠르고 휴대 가능합니다.

+1

"가능하면 도구 상자 기능을 사용하는 대신 기본 기능을 사용하여 코드를 직접 작성하십시오." 이것은 일반적으로 나쁜 조언입니다. 대부분의 툴박스 기능은 적절하게 테스트되고 잘 문서화되며 엣지 케이스를 올바르게 처리합니다. 그렇게하지 않는 강력한 이유가 없다면 이러한 구현을 고집하는 것이 좋습니다. –

+1

@MichaelKoval 나는 그것이 일반적으로 좋은 조언이 아니라고 받아 들인다. 그러나, 난'mvnrnd' 임의의 변수를 생성하기 위해 전화하지 않을 것입니다. m- 파일을 호출하면 MATLAB의 속도가 느려지고 코드를 아는 경우에는 해당 함수 내에서 대부분의 검사가 필요하지 않습니다. 또한 하나 이상의 도구 상자를 사용하면 라이센스 포인트로 인해 코드가 상당히 비싸게됩니다. 일반적으로 프로젝트가 크지 않고 코딩하는 사람이 단 한 명이라면 멋진 기능과 강력한 프로그래밍 방법으로 손실 된 성능을 보완 할 수 있습니다. – Aydin