このRコードは機能しますが、forループは長すぎて見苦しく、Rではforループの使用は推奨されないことを読みました。
私がやりたいのは、さまざまな長さのベクトルをベクトルのリストHaarData @Wから行列MyMatrixの行にコピーすることです。
ベクトルの長さは行列の列数よりも短いため、値を複製して行を埋めたいと思います。
ベクターは、長さ2持っZ Z∈ℤ、およびマトリックス行の長さが必要であるため、Nそのような2 Z ≤nは
library(wavelets)
Data <- seq(1, 16)
n <- as.integer(log2(length(Data)))
#Data <- seq(1, 2 ^ n, 1)
HaarData <- dwt(Data, filter = "haar")
#Square matrix to write data
MyMatrix <- matrix(, nrow = n, ncol = 2 ^ n)
row <- 0 #row counter
for (vector in HaarData@W) {
row <- row + 1
duplication <- (2 ^ n) / length(vector)
newRow <- c(rep(vector, each = duplication))
MyMatrix[row,] <- newRow
}
そもそもなぜ操作をしたいのかわかりませんが、それでも私のアプローチは次のとおりです。
library(wavelets)
library(microbenchmark)
Data <- seq(1, 32)
n <- as.integer(log2(length(Data)))
HaarData <- dwt(as.numeric(Data), filter = "haar")
# Abstract operation in the loop in a function, no side effects
duplicate_coefs <- function(filter_coefs, n){
rep(filter_coefs, each = `^`(2, n - as.integer(log2(length(filter_coefs))) ))
}
microbenchmark(
old = {
#Square matrix to write data
MyMatrix <- matrix(, nrow = n, ncol = 2 ^ n)
row <- 0 #row counter
for (vector in HaarData@W) {
row <- row + 1
duplication <- (2 ^ n) / length(vector)
newRow <- c(rep(vector, each = duplication))
MyMatrix[row,] <- newRow
}
}
,
new = {
n_len <- length(HaarData@W)
new_result <- matrix(unlist( lapply(HaarData@W, duplicate_coefs, n_len) )
, nrow = n_len
, byrow = TRUE)
)
identical(MyMatrix, new_result)
私のマシンでは、約50倍のスピードアップが得られます
Unit: microseconds
expr min lq mean median uq max neval
old 2891.967 2940.0550 3203.14740 2982.5360 3110.3985 6472.223 100
new 48.519 50.8065 59.04673 56.4805 60.8905 302.845 100
お役に立てれば
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加