Matlab: медленное выполнение, но меньше операций - PullRequest
1 голос
/ 08 апреля 2020

Я новичок в Matlab. Это сценарий моей игровой площадки:

function speedtest()
    a = reshape(1:1:30000, 10000, 3);

    tic;
    for i = 1:100
        a(:, [1, 2]) = bsxfun(@minus, a(:, [1, 2]), [1, 1]);
    end
    toc

    tic;
    for i = 1:100
        a = bsxfun(@minus, a, [1, 1, 0]);
    end
    toc
end

И время выполнения:

Elapsed time is 0.007709 seconds.
Elapsed time is 0.001803 seconds.

Первый метод работает меньше, но работает намного медленнее. Это проблема векторизации? Если так, то почему Matlab не может «векторизовать» мой a(:, [1, 2]) выбор?

Обновление:

Согласно @thewaywewalk, я поместил код в отдельную функцию, удалите l oop и используйте timeit. Вот результат:

# a(:, [1, 2]) = bsxfun(@minus, a(:, [1, 2]), [1, 1]);
1.0064e-04

# a = bsxfun(@minus, a, [1, 1, 0]);
6.4187e-05

1 Ответ

1 голос
/ 08 апреля 2020

издержки первого подхода возникли из среза субматрицы. изменение его на

    tic;
    b=a(:,[1,2]);
    for i = 1:100
        b = bsxfun(@minus, b, [1, 1]);
    end
    a(:,[1,2])=b;
    toc

значительно ускоряет его

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