您應該預先分配一次數組,然後在循環訪問CSV文件時填寫每個z切片。從我的測試結果來看,640x480x500雙精度陣列大約需要1.2GB,並且每個直接分配給陣列z-片的500個CSV讀取花費大約3.5分鐘。因此,就RAM的影響和計算時間而言,這是非常成功的:
X <- 640; Y <- 480; N <- 500;
write.csv(matrix(1:(X*Y),X,Y),'pic1.csv',row.names=F); ## for testing
system.time({ x <- array(NA_real_,c(X,Y,N)); }); ## preallocate
## user system elapsed
## 1.640 0.109 1.743
object.size(x);
## 1228800208 bytes
e <- 2; Xv <- -((1+e):(X-e)); Yv <- -((1+e):(Y-e)); Nv <- -((1+e):(N-e));
x[Xv,Yv,Nv];
## , , 1
##
## [,1] [,2] [,3] [,4]
## [1,] NA NA NA NA
## [2,] NA NA NA NA
## [3,] NA NA NA NA
## [4,] NA NA NA NA
##
## , , 2
##
## [,1] [,2] [,3] [,4]
## [1,] NA NA NA NA
## [2,] NA NA NA NA
## [3,] NA NA NA NA
## [4,] NA NA NA NA
##
## , , 3
##
## [,1] [,2] [,3] [,4]
## [1,] NA NA NA NA
## [2,] NA NA NA NA
## [3,] NA NA NA NA
## [4,] NA NA NA NA
##
## , , 4
##
## [,1] [,2] [,3] [,4]
## [1,] NA NA NA NA
## [2,] NA NA NA NA
## [3,] NA NA NA NA
## [4,] NA NA NA NA
##
system.time({ for (i in 1:N) { fileName <- 'pic1.csv'; x[,,i] <- as.matrix(read.csv(fileName)); }; });
## user system elapsed
## 207.000 0.969 208.492
object.size(x);
## 1228800208 bytes
x[Xv,Yv,Nv];
## , , 1
##
## [,1] [,2] [,3] [,4]
## [1,] 1 641 305921 306561
## [2,] 2 642 305922 306562
## [3,] 639 1279 306559 307199
## [4,] 640 1280 306560 307200
##
## , , 2
##
## [,1] [,2] [,3] [,4]
## [1,] 1 641 305921 306561
## [2,] 2 642 305922 306562
## [3,] 639 1279 306559 307199
## [4,] 640 1280 306560 307200
##
## , , 3
##
## [,1] [,2] [,3] [,4]
## [1,] 1 641 305921 306561
## [2,] 2 642 305922 306562
## [3,] 639 1279 306559 307199
## [4,] 640 1280 306560 307200
##
## , , 4
##
## [,1] [,2] [,3] [,4]
## [1,] 1 641 305921 306561
## [2,] 2 642 305922 306562
## [3,] 639 1279 306559 307199
## [4,] 640 1280 306560 307200
格式化它的最好方法可能更多地取決於你將如何使用它。在大多數情況下,我可能會選擇將其存儲爲矩陣列表,但它又取決於它。 –
對於大多數應用程序來說,矩陣列表可以完成這項工作,但是在某一點上,我不得不採用st.dev的意思。在z軸上,所有500張圖片的均值。我找到了一種方法來做這個數組,但不是一個矩陣列表。 是否有可能從數組中提取一個切片到矩陣?如果是這種情況,我寧願將數據放在數組中。 –