Проблема Performace по векторной адресации MATLAB - PullRequest
0 голосов
/ 18 марта 2011

Мне интересно, что быстрее для адресации одного элемента вектора:

1) прямой доступ через

result = a(index)

или

2)элемент с помощью умножения матриц, например

a = [1 2 3 4]';
b = [0 0 1 0];
result = b*a;   % Would return 3

По моему мнению (что происходит от "классического" программирования, такого как C ++), первый метод должен быть более производительным из-за прямого доступа ... второй метод будетнужна итерация по обоим векторам (?).

Причина, по которой я спрашиваю, состоит в том, что matlab очень эффективен в матричных и векторных операциях, может быть, я пропускаю какой-либо аспект, и второй метод более эффективен...

Ответы [ 3 ]

5 голосов
/ 18 марта 2011

Быстрый тест:

function [] = fun1()
a = [1 2 3 4]';
b = [0 0 1 0];
tic;
for i=1:1000000
    r = a(3);
end
toc;
end

Истекшее время: 0,006 секунды

Изменить a(3) на b*a

Истекшее время: 0,9 секунды


Разница в производительности довольно очевидна (и вы должны были сделать это самостоятельно, прежде чем задавать этот вопрос).

Причина этого:

Независимо от того, насколько эффективны вычисления MATLAB, MATLAB по-прежнему необходимо извлечь число 1 на 1, выполнить умножение 1 на 1 и суммировать. Нет надежды быть быстрее, чем один доступ.

В вашем особом случае есть все 0, кроме 1, но, по моему мнению, бесполезно проводить оптимизацию для отдельного особого случая, и для лучшей оптимизации, которую я могу придумать, по-прежнему требуется доступ ко всем элементам хотя бы один раз каждый.


EDIT:

Кажется, у меня сегодня хорошее настроение ...

Изменить a(3) на a(1)*b(1)+a(2)*b(2)+a(3)*b(3)+a(4)*b(4)

Истекшее время: 0,02 секунды

Кажется, что проверка границ (и / или других поручений) занимает больше времени, чем доступ и расчет.

0 голосов
/ 18 марта 2011

Как насчет

3) получить доступ к элементу с помощью матрицы логического индекса:

a = [1 2 3 4]';
b = [0 0 1 0];
result = a(b)

Почти наверняка будет быстрее, чем (2), медленнее, чем (1).

0 голосов
/ 18 марта 2011

Почему вы думаете, что умножение большого числа чисел на нули было бы вообще эффективным?Даже если MATLAB может быть достаточно умным, чтобы сначала выполнить тест перед умножением, он все равно должен выполнить много тестов.

Я задаю этот вопрос, чтобы подчеркнуть, что скалярное произведение вообще не может бытьэффективный.Даже если бы MATLAB был достаточно умен, чтобы знать, что существует только один элемент, который отличен от нуля, чтобы это знать, ему нужно будет выполнить поиск ненулевого элемента.И как бы MATLAB был достаточно умен, чтобы знать, что то, что вы написали как векторное * векторное точечное произведение, на самом деле предназначено только для доступа к одному элементу, а не к истинному точечному произведению для неведомых ему гнусных целей?

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