Я пытаюсь ускорить мой код, потому что он работает очень долго. Я уже выяснил, где проблема. Рассмотрим следующий пример:Векторизация функции, чтобы избежать цикла
x<-c((2+2i),(3+1i),(4+1i),(5+3i),(6+2i),(7+2i))
P<-matrix(c(2,0,0,3),nrow=2)
out<-sum(c(0.5,0.5)%*%mtx.exp(P%*%(matrix(c(x,0,0,x),nrow=2)),5))
У меня есть вектор х с комплексными значениями, вектор имеет 12^11 записей, а затем я хочу, чтобы вычислить сумму в третьем ряду. (Мне нужна функция mtx.exp, потому что это сложная матричная мощность (функция находится в пакете Biodem). Я выяснил, что функция% ^% не поддерживает сложные аргументы.)
Так что моя проблема в том, что если Я стараюсь
sum(c(0.5,0.5)%*%mtx.exp(P%*%(matrix(c(x,0,0,x),nrow=2)),5))
Я получаю сообщение об ошибке: «ошибка в горшочке% *% банке: без облегать аргументы.» Поэтому моим решением было использовать петлю:
tmp<-NULL
for (i in 1:length(x)){
tmp[length(tmp)+1]<-sum(c(0.5,0.5)%*%mtx.exp(P%*%matrix(c(x[i],0,0,x[i]),nrow=2),5))
}
Но, как сказано, это занимает очень много времени. У вас есть идеи по ускорению кода? Я также пробовал использовать, но это занимает столько же времени, сколько и цикл.
Надеюсь, вы можете мне помочь, потому что я должен выполнять эту функцию примерно 500 раз, и это потребовало в первую очередь более 3 часов. Но это не очень приятно ..
Спасибо и очень
К сожалению, может быть, я не объяснить проблему должным образом: Так что есть эта матрица P (что не нормально диагональ матрица) рассмотреть P <-матрица, nrow = 2) эта матрица умножается на другой (по диагонали, эта матрица времени) давайте назовем его C C <(с (2.1,20, 0.3,3.2.) - матрица (c (x [i], 0,0, x [i]), nrow = 2) (для каждого i в (1: leng й (х)) Тогда я хочу взять п-ю степень в этом случае п = 5 (P * C)^5 Это снова умножается на вектор и элементы SUMED вверх. Моя проблема в том, что я не хочу делать это с помощью цикла (поэтому для каждой записи в x эта сумма должна быть рассчитана) – rainer
Если матрица 'C' является скаляром (т.е. диагональю, с тем же элементом везде по диагонали), это все еще можно записать 'sum (mtx.exp (P, 5)/2) * x^5'. –
Okey спасибо, это немного помогает. Следующая проблема, с которой я сталкиваюсь, состоит в том, что мои записи в матрице C не совпадают, они зависят от функции, например: C <-matrix (dnorm (x [i], 0,1), 0,0, dnorm (x [ i], 1,3)) – rainer