Быстрый Матричный Поиск - PullRequest
0 голосов
/ 02 февраля 2012

Мне нужно как можно быстрее вычислить матричный поиск (см. Ниже).

totquadpoint и nbval.Wepast - фиксированные скаляры около 200 каждый (размерность векторов flnewcumyieldpos и flneweta1pos).nexttsteppenal - это трехмерная матрица (размеры не менее 80 * 80 * 80)

Поскольку мне нужно многократно выполнять операцию ниже (этот двойной цикл сам находится в тройном вложенном цикле), мне нужно сделать его быстрым,Есть ли способ сделать это быстрее, чем написано ниже?Если это невозможно в Matlab, какой тип выигрыша я могу ожидать, если попытаюсь создать этот кусок кода на Java / C?

-------- CODE: -----------------

for k=1:totquadpoint
    nexttsteppenalYA1dd=nexttsteppenal(flnewcumyieldpos(k),flneweta1pos(k),:);
    nexttsteppenalYA1du=nexttsteppenal(upflnewcumyieldpos(k),flneweta1pos(k),:);
    nexttsteppenalYA1ud=nexttsteppenal(flnewcumyieldpos(k),upflneweta1pos(k),:);
    nexttsteppenalYA1uu=nexttsteppenal(upflnewcumyieldpos(k),upflneweta1pos(k),:);

    flnewportvalposvec=flnewportvalpos(k,:);
    upflnewportvalposvec=upflnewportvalpos(k,:);

    for we=1:nbval.Wepast                                                
        penddd(k,we)=nexttsteppenalYA1dd(flnewportvalposvec(we));
        penddu(k,we)=nexttsteppenalYA1dd(upflnewportvalposvec(we));
        pendud(k,we)=nexttsteppenalYA1du(flnewportvalposvec(we));
        penduu(k,we)=nexttsteppenalYA1du(upflnewportvalposvec(we));

        penudd(k,we)=nexttsteppenalYA1ud(flnewportvalposvec(we));
        penudu(k,we)=nexttsteppenalYA1ud(upflnewportvalposvec(we));
        penuud(k,we)=nexttsteppenalYA1uu(flnewportvalposvec(we));
        penuuu(k,we)=nexttsteppenalYA1uu(upflnewportvalposvec(we));

    end
end

Ответы [ 2 ]

0 голосов
/ 05 февраля 2012

Вот более читаемая версия кода выше с симулированными значениями для таблиц. Моя проблема в том, как оптимизировать скорость двух вложенных циклов в конце (мне нужно запустить этот цикл, возможно, миллион раз).

quadpoints=800;
nbWe=100;

penddd=zeros(quadpoints,nbWe);
penddu=zeros(quadpoints,nbWe);
pendud=zeros(quadpoints,nbWe);
penduu=zeros(quadpoints,nbWe);
penudd=zeros(quadpoints,nbWe);
penudu=zeros(quadpoints,nbWe);
penuud=zeros(quadpoints,nbWe);
penuuu=zeros(quadpoints,nbWe);

nsp=rand(100,50,100);

ypos=min(sort(poissrnd(50,quadpoints,1),'ascend'),100);
uypos=min(ypos,100);
etapos=min(sort(poissrnd(25,quadpoints,1),'ascend'),50);
uetapos=min(etapos,50);
Vpos=min(sort(poissrnd(50,quadpoints,nbWe),'ascend'),100);
uVpos=min(Vpos,100);

for k=1:quadpoints
     nspdd=nsp(ypos(k),etapos(k),:);
     nspdu=nsp(uypos(k),etapos(k),:);
     nspud=nsp(ypos(k),uetapos(k),:);
     nspuu=nsp(uypos(k),uetapos(k),:);
     dVvec=Vpos(k,:);
     uVvec=uVpos(k,:);

      for we=1:nbWe
     penddd(k,we)=nspdd(dVvec(we));
         penddu(k,we)=nspdd(uVvec(we));
         pendud(k,we)=nspdu(dVvec(we));
         penduu(k,we)=nspdu(uVvec(we));
         penudd(k,we)=nspud(dVvec(we));
         penudu(k,we)=nspud(uVvec(we));
         penuud(k,we)=nspuu(dVvec(we));
         penuuu(k,we)=nspuu(uVvec(we));

      end
end
0 голосов
/ 02 февраля 2012

Это:

for w=1:n
    p(k,w)=d(f(w));
end

должно быть:

p(k,1:n)=d(f(1:n));

Или даже лучше, когда n - это длина f:

p(k,:)=d(f);

Для внешнего цикла вам, вероятно, понадобится sub2ind().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...