2012-02-16 17 views

Odpowiedz

10

Korzystając bsxfun zamiast repmat:

mat = rand(100, 8); 
rowsum = sum(mat,2); 
mat = bsxfun(@rdivide, mat, rowsum); 
-2

Dobrze

rand(100,8) 

generuje macierz liczb losowych z 100 wierszy i 8 kolumn, którego wszystkie wpisy można dodawać do 1. Jeśli to nie to, co chcesz, będziesz musiał wyjaśnij sobie trochę więcej.

+1

-1, który tworzy matrycę liczb losowych, z których każdy rozdziela się między 0 i 1. wiersze don” t suma do 1, o którą poprosił pytający. – Matt

4

można najpierw utworzyć losową macierz, a następnie normalizuje je tak, że każdy wiersz ma sumę równą 1 (jeśli to, co masz na myśli):

mat=rand(100,8); 
matnorm=repmat(sum(mat,2),1,8); 
mat=mat./matnorm; 
6

Oto kolejny pomysł: dla każdego wiersza można wygenerować 7 liczb losowych (od 0 do 1) i traktować je jako swoich „interwał” miejsc - innymi słowy, w swoim 8 liczb losowych tę kwotę do 1, te są twoje częściowe sumy. Następnie możesz je sortować i brać różnice, aby uzyskać wynikowe liczby losowe. Oto kod, o którym myślę:

numrows = 100; 
partialsums = [zeros(numrows,1), rand(numrows,7), ones(numrows,1)]; 
partialsums = sort(partialsums, 2); 
randmat = diff(partialsums, 1, 2); 

Rozkład liczb będzie różny w zależności od sposobu, w jaki to robisz. Porównałem tę metodę z tą opublikowaną przez Aabaza, i dostałem to dla dystrybucji.

enter image description here

Więc mój wygląda trochę bardziej wykładniczy, masz jakieś wyższe wartości, a jego jest trochę bardziej jednolita, ale z niższym odcięcia liczb losowych, które można uzyskać.

+0

+1 za wskazanie, że istnieją różne sposoby powodujące różne rozkłady. –

1

krok 1: Oblicz normę wektora, która jest pierwiastkiem kwadratowym z sumy kwadratów elementów w tym wektorze.

Krok 2: Podziel każdy element w wektorze według normy wektora.

Krok 3: Pomnożenie uzyskanego wektora przez jego transpozycję do kwadratu każdego elementu w wektorze.

Można wówczas zobaczyć, że suma (końcowych) wynikające elementów wektora dodać do 1.

Powiązane problemy