несколько дней назад я задал эту тему о вызове пользовательской функции в цикле, которая была хорошо решена комбинацией
eval(parse(text = Function text))
, вот ссылка: Автоматическое создание и использование пользовательскихсделал функцию в R .Это позволило мне работать с for loop
и автоматически вызывать нужную мне функцию из фрейма данных, хранящего тело создаваемой функции.
Теперь я хотел бы перенести вопрос на следующий уровень.Моя проблема - время вычислений.Мне нужно оценить что-то вроде 52 показателей по гиперспектральному изображению.это означает, что в R мое гиперспектральное изображение загружается в виде трехмерного массива 512x512x204 полос.
Я хотел бы параллельно выполнять оценку индексов, чтобы сократить время вычислений.Вот фиктивный пример того, что я хотел бы подражать, но не в параллельных вычислениях.
# create a fake matrix rappresenting my Hyperpectral image
HYPR_IMG=array(NA,dim=c(5,3,4))
HYPR_IMG[,,1]=1
HYPR_IMG[,,2]=2
HYPR_IMG[,,3]=3
HYPR_IMG[,,4]=4
image.plot(HYPR_IMG[,,1], zlim=c(0,20))
image.plot(HYPR_IMG[,,2], zlim=c(0,20))
image.plot(HYPR_IMG[,,3], zlim=c(0,20))
image.plot(HYPR_IMG[,,4], zlim=c(0,20))
#create a fake DF for simulating my indices stored in the dataframe
IDXname=c("IDX1","IDX2","IDX3","IDX4")
IDXFunc=c("HYPR_IMG[,,1] + 3*HYPR_IMG[,,2]",
"HYPR_IMG[,,3] + HYPR_IMG[,,2]",
"HYPR_IMG[,,4] + HYPR_IMG[,,2] - HYPR_IMG[,,3]",
"HYPR_IMG[,,1] + HYPR_IMG[,,4] + 4*HYPR_IMG[,,2] + HYPR_IMG[,,3]")
IDX_DF=as.data.frame(cbind(IDXname,IDXFunc))
# that was what I did before
Store_DF=data.frame(NA)
for (i in 1: length(IDX_DF$IDXname)) {
IDX_ID=IDX_DF$IDXname[i]
IDX_Fun_tmp=IDX_DF$IDXFunc[which(IDX_DF$IDXname==IDX_ID)] #use for extra care to select the right fuction
IDXFunc_call=paste("IDXfun_tmp=function(HYPR_IMG){",IDX_Fun_tmp,"}",sep="")
eval(parse(text = IDXFunc_call))
IDX_VAL=IDXfun_tmp (HYPR_IMG)
image.plot(IDX_VAL,zlim=c(0,20)); title(main=IDX_ID)
temp_DF=as.vector(IDX_VAL)
Store_DF=cbind(Store_DF,temp_DF)
names(Store_DF)[i+1] <- as.vector(IDX_ID)
}
Моя конечная цель - получить тот же самый Store_DF
, хранящий все значения индексов.Здесь у меня есть цикл for
, но использование цикла foreach
должно ускорить процесс.При необходимости я работаю с Windows 8 или более как ОС.
Это действительно возможно?Смогу ли я в конце сократить общее вычислительное время, имея тот же Store_DF
фрейм данных или что-то похожее на матрицу с именами столбцов?
Большое спасибо !!!