использование функции тик-так в Matlab

У меня есть два разных способа реализовать одно и то же, но я думаю, что второй — лучший. Тем не менее, я получаю лучший результат при использовании тик-так для первого. Как идет ?

j=6;
i=j;
Savings = zeros(i,j);
Costs = magic(400);

tic;
for x=2:i
   for y=2:j
     if(x ~= y)
       Savings(x,y) = Costs(x,1) + Costs(1,y) - Costs(x,y);
     end
   end
end
first=toc;

disp(num2str(first))

Savings = zeros(i,j);

tic;
Ix=2:i; 
Iy=2:j;
I = false(i,j);
I(Ix,Iy) = bsxfun(@ne, Ix', Iy);
S = bsxfun(@plus, Costs(Ix,1), Costs(1,Iy)) - Costs(Ix,Iy);
Savings(I) = S(I(Ix,Iy));
second=toc;

temp = Savings;
disp(num2str(second))

person Babibel    schedule 13.09.2013    source источник
comment
Довольно просто, ваш метод цикла просто быстрее.   -  person Dan    schedule 13.09.2013
comment
@ Дэн Нет, это не так. Это быстрее для маленьких матриц. Смотрите мой ответ.   -  person Mohsen Nosratinia    schedule 13.09.2013


Ответы (1)


Это зависит от того, как JIT-движок MATLAB может улучшить производительность for циклов. Для маленьких матриц работает нормально, а для больших не очень. Кажется, для i меньше 60, первый метод быстрее, но не для больших матриц. Попробуйте этот тест

for j=[6 30 60 100 200 400 600]
    disp(['j=' num2str(j)]);
    i=j;
    Savings = zeros(i,j);
    Costs = magic(600);

    tic;
    for mm=1:1e2
        for x=2:i
            for y=2:j
                if(x ~= y)
                    Savings(x,y) = Costs(x,1) + Costs(1,y) - Costs(x,y);
                end
            end
        end
    end
    first=toc;

    disp(num2str(first));

    Savings = zeros(i,j);

    tic;
    for mm=1:1e2
        Ix=2:i;
        Iy=2:j;
        I = false(i,j);
        I(Ix,Iy) = bsxfun(@ne, Ix', Iy);
        S = bsxfun(@plus, Costs(Ix,1), Costs(1,Iy)) - Costs(Ix,Iy);
        Savings(I) = S(I(Ix,Iy));
    end
    second=toc;

    temp = Savings;
    disp(num2str(second))
end

На моей машине он возвращает:

j=6
0.0001874
0.0052893
j=30
0.0034454
0.0057184
j=60
0.011097
0.01268
j=100
0.027957
0.023952
j=200
0.11529
0.058686
j=400
0.45791
0.37246
j=600
1.1496
0.74932
person Mohsen Nosratinia    schedule 13.09.2013