Более эффективный код Matlab, пожалуйста - PullRequest
4 голосов
/ 02 ноября 2011

Я новичок в Matlab, поэтому я не знаю всех ярлыков, которые Matlab должен сделать код более эффективным и быстрым. Я хакнул что-то в matlab для домашнего задания, сосредоточившись на выполнении задания, а не на эффективности. Теперь я обнаружил, что трачу больше времени на ожидание программы, чем на ее кодирование. Ниже приведена головная боль вложенных циклов, которая занимает целую вечность. Есть ли более быстрый или эффективный способ кодирования без большого числа циклов?

for i = 1:ysize
for j = 1:xsize
    MArr = zeros(windowSize^2, 2, 2);
    for i2 = i - floor(windowSize/2): i + floor(windowSize/2)
        if i2 > 0 && i2 < ysize + 1
            for j2 = j - floor(windowSize/2): j + floor(windowSize/2)
                if j2 > 0 && j2 < xsize + 1
                    mat =  weight*[mappedGX(i2,j2)^2, mappedGX(i2,j2)*mappedGY(i2,j2); mappedGX(i2,j2)*mappedGY(i2,j2), mappedGY(i2,j2)^2];
                    for i3 = 1:2
                        for j3 = 1:2
                            MArr(windowSize*(j2-(j - floor(windowSize/2))+1) + (i2-(i - floor(windowSize/2)) + 1),i3,j3) = mat(i3,j3);
                        end
                    end
                end
            end
        end
    end
    Msum = zeros(2,2);
    for k = size(MArr)
        for i2 = 1:2
            for j2 = 1:2
                Msum = Msum + MArr(k,i2,j2);
            end
        end
    end
    R(i,j) = det(Msum) - alpha*(trace(Msum)^2);
    R = -1 * R;
end
end

1 Ответ

8 голосов
/ 02 ноября 2011

Вместо цикла используйте двоеточия.Например:

                    for i3 = 1:2
                        for j3 = 1:2
                            MArr(windowSize*(j2-(j - floor(windowSize/2))+1) + (i2-(i - floor(windowSize/2)) + 1),i3,j3) = mat(i3,j3);
                        end
                    end

Можно записать как:

 MArr(windowSize*(j2-(j-floor(windowSize/2))+1)+(i2-(i-floor(windowSize/2))+1),:,:)=mat;

После того, как вы найдете все места, где это можно сделать, научитесь использовать индексацию вместо циклических, например,

i2 = i - floor(windowSize/2): i + floor(windowSize/2);
i2=i2(i2>0 && i2<ysize+1);
j2 = j - floor(windowSize/2): j + floor(windowSize/2);
j2=j2(j2>0 && j2<xsize+1);
mat =  weight*[mappedGX(i2,j2)^2, mappedGX(i2,j2)*mappedGY(i2,j2); 

(Примечание для опытных пользователей: последняя строка может не работать, если mappedGX является матрицей, а i2 / j2 не представляет прямоугольную подматрицу. В таком случае вы будетенужно sub2ind())

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