Я знаком с 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.
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,
Вам разрешено и рекомендуется редактировать свой вопрос, чтобы включить такую информацию, как ожидаемый результат. Похоже, было бы также полезно более четко указать, какую структуру вывода вы ищете.
Вы можете использовать следующий код 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)
Большое спасибо. Но, извините, пример не удачный. То, что я хочу сделать, гораздо сложнее, чем получение средств. Я хочу знать, как использовать матрицу или трехмерный массив в качестве вывода.
Вот мое предлагаемое решение, основанное на коде 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?
Пересмотрено для "foreach"
Если это правильно, пожалуйста, нажмите как ответ.
Большое спасибо. Работает без ошибок. Однако сгенерированные случайные числа появляются только в 100-й позиции, а в остальных случаях - нули...
Исправлено. Проверьте еще раз
Большое спасибо. Оно работает. Но я хочу иметь и X, и Y в одном foreach. Возможно ли или мне нужно сделать функцию или что-то в этом роде?
Возможно. Поместите X и Y в переменную списка Z. Затем напишите функцию, которая возвращает список. Но это должен быть другой пост.
Можете ли вы показать вывод из Matlab