Параллельные вычисления в R

Я знаком с Matlab, но недавно начал использовать R. Столкнулся с проблемой при использовании параллельных вычислений в R.

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

X=zeros(10,5,100);
Y=zeros(100,2);
parfor i=1:100;
 X(:,:,i) = randn(10,5);
 Y(i,:) = randn(1,2);
end

Однако, пока я исследовал, foreach в R, кажется, возвращают только векторы (список?), А матрица или массив кажутся недопустимыми. Мне интересно, как мне нужно написать код для реализации того, что делает Matlab.

Можете ли вы показать вывод из Matlab

akrun 17.02.2023 03:39

Ans = 0.0405 -0.1016 0.1268 0.1561 -0.2042 0.1425 -0.0373 -0.0334 -0.1147 -0.0321 0.0746 0.0042 -0.0137 0.0499 -0.1176 0.0625 0.0355 -0.1674 -0.1580 -0.0772 0.0858 -0.2022 -0.2779 -0.0753 -0.0047 -0.0232 0.0171 0.0053 0.1154 -0.0156 0.1498 0,0665 0,1242 0,0750 -0,0071 -0,1894 0,0330 0,1159 0,1271 -0,1790 -0,0326 -0,0152 -0,0657 -0,0260 -0,1102 -0,0377 0,1584 0,1051 -0,0187 -0,0135 0,1584 0,1051 -0,0187 -0,035 0,1584 0,1051 -0,0187 -0,035 0,1584 0,1051 -0,0187 -0,037 0,1584 0,1051 -0,0187 -0,037 0,1584 0,1051 -0,0187 -0,0377 0,1584 0,1051 -0187 -0,0377,0684 0,

user0131 17.02.2023 03:44

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

Jon Spring 17.02.2023 06:57
Типы данных JavaScript
Типы данных JavaScript
В JavaScript существует несколько типов данных, включая примитивные типы данных и ссылочные типы данных. Вот краткое объяснение различных типов данных...
Как сделать движок для футбольного матча? (простой вариант)
Как сделать движок для футбольного матча? (простой вариант)
Футбол. Для многих людей, живущих на земле, эта игра - больше, чем просто спорт. И эти люди всегда мечтают стать футболистом или менеджером. Но, к...
Знайте свои исключения!
Знайте свои исключения!
В Java исключение - это событие, возникающее во время выполнения программы, которое нарушает нормальный ход выполнения инструкций программы. Когда...
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик Модуль flexbox, также известный как гибкий модуль разметки box, помогает эффективно проектировать и...
Введение в раздел "Заголовок" в HTML
Введение в раздел "Заголовок" в HTML
Говорят, что лучшее о человеке можно увидеть только изнутри, и это относится и к веб-страницам HTML! Причина, по которой некоторые веб-страницы не...
0
3
75
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать следующий код R для репликации вашего кода Matlab. Обратите внимание, что R векторизован, поэтому циклы for часто не нужны.

X <- rep(0, 10*5*100)
Y <- rep(0, 100*2)

dim(X) <- c(10,5,100)
dim(Y) <- c(100,2)

set.seed(1234)  # This is just for replication. Can omit if you want fully random numbers
X[] <- rnorm(length(X))
Y[] <- rnorm(length(Y))

apply(X, c(1,2), mean)
apply(Y, 2, mean)

Выход:

> apply(X, c(1,2), mean)
              [,1]          [,2]         [,3]         [,4]        [,5]
 [1,]  0.055024278 -0.0205575146 -0.071816174 -0.087659326  0.12707484
 [2,] -0.018254630  0.0821710032 -0.005589141  0.049391162 -0.01413225
 [3,] -0.009338280  0.0284398951 -0.004083183  0.013750904 -0.02076238
 [4,]  0.039544807 -0.0425689205  0.016054568  0.013936608 -0.06183537
 [5,]  0.053641184  0.1362104005  0.069674908  0.008190821 -0.21042331
 [6,]  0.065895652 -0.0098767327 -0.082148255  0.038705556 -0.05255018
 [7,]  0.007917696 -0.0002747114 -0.045812106 -0.062452164  0.23984287
 [8,] -0.173435275  0.0328011859 -0.053835173  0.057308693 -0.03760174
 [9,]  0.047481900 -0.0225967973 -0.161777736  0.005625679 -0.05406814
[10,] -0.031460338  0.0628553230 -0.176667084 -0.098304874  0.06060704
> apply(Y, 2, mean)
[1]  0.06083109 -0.03338719

Вы также можете немного упростить это с помощью следующих команд:

set.seed(1234)
X <- rnorm(10*5*100)
Y <- rnorm(100*2)

dim(X) <- c(10,5,100)
dim(Y) <- c(100,2)

apply(X, c(1,2), mean)
apply(Y, 2, mean)

Большое спасибо. Но, извините, пример не удачный. То, что я хочу сделать, гораздо сложнее, чем получение средств. Я хочу знать, как использовать матрицу или трехмерный массив в качестве вывода.

user0131 17.02.2023 05:02
Ответ принят как подходящий

Вот мое предлагаемое решение, основанное на коде Matlab в вопросе.

#install.packages("foreach")
#install.packages("doParallel")
library(foreach)
library(doParallel)
X <- array(c(rep(0,10), rep(0,5), rep(0,100)),dim = c(10,5,100))
Y <- array(c(rep(0,100), rep(0,2)),dim = c(100,2))
X=foreach(i=1:100) %dopar% {
  X[ , , i]=   array(c( rnorm(10), rnorm(5)),dim = c(10,5))
  X
}
Y=foreach(i=1:100) %dopar% {
  Y[ i , ]=   array(c( rnorm(1), rnorm(2)),dim = c(1,2))
  Y
}

Большое спасибо. Но работает ли это с foreach или другой командой parellel?

user0131 17.02.2023 08:47

Пересмотрено для "foreach"

SBMVNO 17.02.2023 08:59

Если это правильно, пожалуйста, нажмите как ответ.

SBMVNO 17.02.2023 10:09

Большое спасибо. Работает без ошибок. Однако сгенерированные случайные числа появляются только в 100-й позиции, а в остальных случаях - нули...

user0131 17.02.2023 10:32

Исправлено. Проверьте еще раз

SBMVNO 17.02.2023 10:49

Большое спасибо. Оно работает. Но я хочу иметь и X, и Y в одном foreach. Возможно ли или мне нужно сделать функцию или что-то в этом роде?

user0131 17.02.2023 11:06

Возможно. Поместите X и Y в переменную списка Z. Затем напишите функцию, которая возвращает список. Но это должен быть другой пост.

SBMVNO 17.02.2023 11:22

Другие вопросы по теме