Самый быстрый способ оценки выражения в Matlab - PullRequest
0 голосов
/ 23 февраля 2012

Входы:

  • произвольные логические векторы (~ 2M элементов): i1,i2,...,in
  • произвольное логическое выражение: например. "or(and(not(i1),i2),xor(i3,i4))"

Выход:

  • результирующий логический вектор o o=eval("or(and(not(i1),i2),xor(i3,i4))")

Есть ли более быстрый способ, чем симуляция функции eval в Matlab в функции MEX? Будет ли MEX Eval на самом деле быстрее, чем родной Eval? Если да, сколько раз?

Ответы [ 2 ]

1 голос
/ 23 февраля 2012

я написал:

i1 = randi([0,1],1,10^6);
i2 = randi([0,1],1,10^6);
i3 = randi([0,1],1,10^6);
i4 = randi([0,1],1,10^6);

(да, эти векторы имеют только 1M элементов, но не 2M)

тогда

tic,or(and(not(i1),i2),xor(i3,i4)); toc

который дал

Elapsed time is 0.047936 seconds.

Я думаю, вам будет сложно получить результат быстрее, используя функцию MEX; У меня такое ощущение, что процедура MEX все еще будет просыпаться, когда чистый раствор Matlab поднял ноги и открыл холодное пиво.

Но я с нетерпением жду, чтобы оказаться неправым, как это часто бывает.

0 голосов
/ 11 апреля 2012

Я реализовал eval как функцию MEX. Я проверил его на случайных выражениях глубины 4. Мой MEX eval в 2 раза быстрее, чем собственный Matlab eval (15,1 с против 31,4 с, 1000 итераций)

...