Jarek Statinowy

Jarek Statinowy Z zapałem do pracy

Temat: Generowanie podzbiorów 0-1 w R

Witam

Mam taki problem:
Wszystkich n- elementowych ciągów 0-1 jest jak wiemy 2^n (pomijając 0000..0 mamy ich 2^n-1)

np 3 elementowych jest 7

100
010
001
110
101
011
111

Problem w tym, że dla n=30 mamy 1 073 741 823 ciągów a chciałbym mieć to zapisane w macierzy czyli 30 kolumn i dużo wierszy. Niestety program mi się wysypuje bo za dużo pamięci potrzebuje i komp się buntuje.

Generalnie napisałem funkcję która mi to generuje i działa dla mniejszych n

Znalazłem rozwiązanie ale nie wiem jak zastosować:
Można podzielić rozwiązanie na kilka części np:
żeby najpierw program wypisał m pierwszych wyników a później pozostałe
np
100
010
001
110

a później
101
011
111

Nie wiem jednak jak napisać by program wiedział od czego ma zacząć wypisywać drugą macierz ani też na czym zakończył pierwszą. W ogólniejszym przypadku jak podzielić wypisywanie na M macierzy.

Reasumując chciałbym zapytać czy jest jakiś szybki sposób na to by program wypisał powiedzmy 16 tablic (30 kolumn po 67108864wierszy [no w rzeczywistości 15 z 67108864 wierszami a jedną z 67108863 wierszami])
by w rezultacie dostać wszystkie kombinacje 0-1 ciągów 30 element-owych.

Z góry dziękuje
Paweł Broda

Paweł Broda Software Engineer

Temat: Generowanie podzbiorów 0-1 w R

czyli de facto interesuje cię reprezentacja binarna liczb z zakresu 1 do 2^30 - popatrz na funkcję intToBin z pakietu R.utils (albo intToBits z base)Ten post został edytowany przez Autora dnia 24.02.16 o godzinie 11:03
Jarek Statinowy

Jarek Statinowy Z zapałem do pracy

Temat: Generowanie podzbiorów 0-1 w R

Wymysliłem by użyć

tabela_cala=as.matrix(expand.grid(rep(list(0:1), 30)))[-1,]


i jakoś ją poszykować np.


P=(2^30)/8
tabela1=as.matrix(expand.grid(rep(list(0:1), N)))[1:P,][-1,]
tabela2=as.matrix(expand.grid(rep(list(0:1), N)))[P+1:2P,]
tabela3=as.matrix(expand.grid(rep(list(0:1), N)))[2P+1:3P,]
...
tabela8=as.matrix(expand.grid(rep(list(0:1), N)))[7P+1:8P,]


z tym, że tak to nie chce chodzić, tj. trzeba osobno policzyć początek i koniec (to z tym P) i dopiero później wstawiać.

Może użyć pętli
 for (i in 1:8)
{
pocz=...(i)
kon=...(i)
tabela=as.matrix(expand.grid(rep(list(0:1), N)))[pocz:kon]
}


To wyżej to tylko taki psełdo kod. Jeszcze niem wime jak go poprawnie napisać

Pojawia się też problem, że chce by program wygenerował 8 tablic a teraz to będzie nadpisywał a nie wiem jak zapisać by dla każdego i program tworzył nową macierz (tabela)

Liczę na wskazówki
PozdrawiamTen post został edytowany przez Autora dnia 24.02.16 o godzinie 13:52
Jarek Statinowy

Jarek Statinowy Z zapałem do pracy

Temat: Generowanie podzbiorów 0-1 w R

Rozwiązałem jeden problem tj. udało mi się w pętli ustawić by wczytywał poprawnie początek i koniec, ale w dalszym ciągu nie umiem wygenerować kilku macierzy tj. nie wiem jak zrobić by program stworzył te osiem macierzy o rożnych nazwach.

Macie jakieś wskazówki dla mnie i mi podobnych :)

A może jakiś inny pomysł

Z góry dziękuje
Jarek Statinowy

Jarek Statinowy Z zapałem do pracy

Temat: Generowanie podzbiorów 0-1 w R

Ponawiam prośbę o pomoc

Potrzebne mi jest te kilka tablic do innego programu bo jedna jest za duża (za mała pamięć w kompie)

dla 1-512 napisałem z ręki (dzieli na 8 tablic) N=9 czyli wychodzi 2^N wyników czyli 512

tab1=as.matrix(expand.grid(rep(list(0:1), N)))[1:64,]
tab2=as.matrix(expand.grid(rep(list(0:1), N)))[65:128,]
tab3=as.matrix(expand.grid(rep(list(0:1), N)))[129:192,]
...
tab8=as.matrix(expand.grid(rep(list(0:1), N)))[449:512,]


Problem w tym, że ja chce ustalić na samym początki na ile ma mi program podzielić i muszę mieć dostęp do wszystkich powstałych tablic a ponieważ robię to w pętli to uzyskane tablice mi się nadpisują. Jak zrobić by powstałe tablice były zapisywane oddzielnie

Tablice te potrzebne mi są do dalszych prac np dla pierwszej tablicy póxniej mam


NNNN=8 #(to chcę wpisywać by mi dzieloł na tyle części)
N=30 #(to też ustalam na początku) Generalnie to implikuje ile będzie wyników bo będzie ich 2^N


wyniki1=matrix(0,((2^N)/NNNN),N)

for(i in 1:((2^N)/NNNN))
{
for(j in 1:N)
{
if(tab1[i,j]!=0){wyniki1[i,j]=(R[j]^2)/(tab1[i,]%*%(as.vector(r[,j])))}
}
}

maks1=which.max(rowSums(wyniki1))
tab1[maks1,]
Hmax1=max(rowSums(wyniki1))
Hmax1

Ten post został edytowany przez Autora dnia 16.03.16 o godzinie 14:06

Następna dyskusja:

Algorytmy AI i generowanie ...




Wyślij zaproszenie do