R: Почему этот внешний вызов такой медленный? Как я могу ускорить это? - PullRequest
1 голос
/ 03 февраля 2020

Пусть a, b - два вектора различной длины. Мне нужно установить матрицу с элементами exp(-1i*a*b), то есть для каждой пары элементов в a, b я хочу умножить на мнимую единицу, а затем взять экспоненты.

Хорошо, поэтому я вытащил внешнюю функцию и напишите

outer(a, b, FUN = function(x,y) exp(-1i*x*y))

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

Есть ли альтернатива, чтобы ускорить это?

1 Ответ

2 голосов
/ 03 февраля 2020

Какой BLAS вы используете? По умолчанию достаточно медленный.

Вы можете установить OpenBLAS , что значительно быстрее.

В моей системе работа

a <- runif(1e5, -2, 2) 
b <- runif(2e3, -4,3)
t <- exp(-1i*tcrossprod(a, b))

занимает 10 секунд и производит матрицу 3Gb.

  • Манджаро linux
  • R-3.6.2
  • OpenBLAS
  • i7 1065 16 ГБ ОЗУ
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...