Jak urychlit tento druh dvojího pro smyčce?

hlasů
3

Jsem programuje algoritmus očekávání-zvětšení s R. Za účelem urychlení výpočtu, chtěl bych vektorizovat tohoto zúžení. Vím, že N je asi stokrát k.

MyLoglik = 0
for (i in c(1:N))
{
 for (j in c(1:k))
 {
  MyLoglik = MyLoglik + MyTau[i,j]*log(MyP[j]*MyF(MyD[i,], MyMu[j,], MyS`j`))
 }
}

K dispozici je také tento seznam matic:

MyDf.list <- vector(list, k)
for(i in 1:k)
{
 MyDf.list`i` <- matrix(0,d,d)
 for (j in c(1:N))
 {
  MyDf.list`i` = MyDf.list`i` + MyTau[j,i]*as.numeric((MyD[j,]-MyMu[i,])) %*% t(as.numeric(MyD[j,]-MyMu[i,]))  
 }
 MyDf.list`i` = MyDf.list`i` / MyM[i]
}

Jsem zrychlil věci trochu pomocí:

MyLoglik = 0
for (j in c(1:k))
{
 MyR= apply(MyD, 1, function(x) log(MyP[j]*MyF(x, MyMu[j,], MyS`j`)))
 MyLoglik = MyLoglik + sum(MyTau[,j]*MyR)
}

a:

d = dim(MyD)[2]
MyDf.list <- vector(list, k)
for(i in 1:k)
{
 MyDf.list`i` <- matrix(0,d,d)
 MyR= apply(MyD, 1, function(x) as.numeric((x-MyMu[i,])) %*% t(as.numeric(x-MyMu[i,])))
 MyDf.list`i` = matrix(rowSums(t(MyTau[,i]*t(MyR))) / MyM[i],d,d)
}
Položena 22/11/2010 v 19:20
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
4

Za první, já jsem za předpokladu Myf je funkce, které jste udělal? Pokud můžete ujistit, že bude trvat vaše matice a seznamy jako vstupy a výstupy matici, můžete udělat něco jako:

MyLoglik = sum(MyTau%*%log(MyP)) + sum(MyTau*log(MyF(MyD, MyMu, MyS)))

Za druhé si myslím, že proto, že děláte to jako seznam bude obtížnější vektorizovat. Možná, že místo seznamu matric můžete mít 3-rozměrné pole? Takže MyDf.array [i, j, k] má rozměry N, d, d (nebo d, d, N).

Odpovězeno 22/11/2010 v 19:59
zdroj uživatelem

hlasů
3

Nerad to dokonce naznačují to předčasně, ale je to jedna z těch věcí, kde vybudování C-rozšíření v oblasti výzkumu by mohlo mít smysl. Pro matrice s definovanou (známý) Rozměry (který zde!), C-rozšíření není tak těžké stavět, slibuju! Nejodpornější bit zde bude pravděpodobně průchodem v ‚Myf‘

My R-poznání je zcela zastaralý, ale smyčky (zejména, jako je tento!) Bývaly brutální.

Možná, že načasování a přijít na to, která část je bude pomáhat pomalá? Je to Myf? Co když se to změnit identitu?

Odpovězeno 22/11/2010 v 19:57
zdroj uživatelem

hlasů
2

Můžete snížit o práci ve vnitřní smyčce, když věci jsou symetrické: A[i,j] = A[j,i]

Odpovězeno 22/11/2010 v 19:27
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more