Просто используйте temp_mat <- pmin(temp_mat, 1)
. См. ?pmin
для более широкого использования параллельных минимумов.
Пример:
set.seed(0); A <- matrix(sample(1:3, 25, replace = T), 5)
#> A
# [,1] [,2] [,3] [,4] [,5]
#[1,] 3 1 1 3 3
#[2,] 1 3 1 2 3
#[3,] 2 3 1 3 1
#[4,] 2 2 3 3 2
#[5,] 3 2 2 2 1
B <- pmin(A, 2)
#> B
# [,1] [,2] [,3] [,4] [,5]
#[1,] 2 1 1 2 2
#[2,] 1 2 1 2 2
#[3,] 2 2 1 2 1
#[4,] 2 2 2 2 2
#[5,] 2 2 2 2 1
обновление
Поскольку у вас есть опыт работы в области вычислительной науки, я хотел бы предоставить более подробную информацию.
pmin
быстрый, но далекий от высокой производительности. Его префикс «parallel» предлагает только element-wise
. Значение «векторизации» в R не совпадает с «векторизацией SIMD» в HPC. R - интерпретируемый язык, поэтому «векторизация» в R означает выбор для цикла уровня C, а не цикла уровня R. Поэтому pmin
просто закодирован с тривиальным циклом С.
Реальные высокопроизводительные вычисления должны быть полезны для векторизации SIMD. Я считаю, что вы знаете встроенные функции SSE/AVX. Поэтому, если вы напишете простой код C, используя _mm_min_pd
от SSE2
, вы получите ~ 2 раза ускорение от pmin
; если вы видите _mm256_min_pd
от AVX, вы получите ~ 4 раза ускорение от pmin
.
К сожалению, сам R не может выполнять SIMD. У меня есть ответ на сообщение в Does R leverage SIMD when doing vectorized calculations? относительно этой проблемы. На ваш вопрос, даже если вы связали свой R с HPC BLAS, pmin
не будет пользоваться SIMD, просто потому, что pmin
не включает никаких операций BLAS. Поэтому лучше сделать запись скомпилированного кода самостоятельно.
Я не думаю, что это не имеет ничего общего с R будучи столбцам. 'pmin' возвращает минимальный размер элемента между переданными элементами, поэтому 1 просто принуждается к объекту тех же размеров. Например, если передаются разные векторы по размеру, вы получаете предупреждение о том, что элементы перерабатываются. – Gabe
Хотя это не то, что запросил ОП, существует ряд способов реализации массовых параллельных вычислений в Р.Примеры включают пакеты 'snow',' multicore', 'foreach',' Rmpi', 'Rth',' gputools' и базовый пакет 'parallel', который объединил несколько из ранее ранее отдельных пакетов. Вот [хорошая ссылка] (https://books.google.com/books/about/Parallel_Computing_for_Data_Science.html?id=SsbECQAAQBAJ) о состоянии дел в этой теме. – RHertel
«Например, проблема OP не может извлечь выгоду из этой формы, становится связанной с памятью. Настройка нескольких потоков приведет к замедлению». Зачем? Разве это не стандартная задача параллельного программирования, чтобы разбить матрицу на отдельные куски и позволить каждому обрабатывать отдельный поток? В этом случае нет необходимости связываться между потоками. Это выглядит как стандартный пример неловко параллельной ситуации, с которой можно легко обращаться с R. – RHertel