Tôi nghĩ rằng những gì bạn đang tìm kiếm là circulant.matrix
từ gói lgcp
.
Nếu x là một ma trận có các cột là các căn cứ của tiểu khối của một khối ma trận circulant, sau đó chức năng này sẽ trả về khối circulant ma trận quan tâm.
ví dụ
x <- matrix(1:8,ncol=4)
circulant(x)
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
# [1,] 1 2 3 4 5 6 7 8
# [2,] 2 1 4 3 6 5 8 7
# [3,] 7 8 1 2 3 4 5 6
# [4,] 8 7 2 1 4 3 6 5
# [5,] 5 6 7 8 1 2 3 4
# [6,] 6 5 8 7 2 1 4 3
# [7,] 3 4 5 6 7 8 1 2
# [8,] 4 3 6 5 8 7 2 1
cách tiếp cận thay thế
Dưới đây là một cách tiếp cận đánh giá cao hiệu quả sử dụng kronecker
và Reduce
bcirc <- function(list.blocks){
P <- lapply(seq_along(list.blocks), function(x,y) x ==y, x = circulant(seq_along(list.blocks)))
Reduce('+',Map(P = P, A=list.blocks, f = function(P,A) kronecker(P,A)))
}
benchmarking với @flodel và @Ben Bolker
lbirary(microbenchmark)
microbenchmark(bcm(C), bcirc(C), bcMat(C))
Unit: microseconds
expr min lq median uq max neval
bcm(C) 10836.719 10925.7845 10992.8450 11141.1240 21622.927 100
bcirc(C) 444.983 455.7275 479.5790 487.0370 569.105 100
bcMat(C) 288.558 296.4350 309.8945 348.4215 2190.231 100
Tôi không thể tìm ra' lgcp :: circulant.matrix' đang làm gì. Có thể sử dụng nó với danh sách 'C' tùy ý không ?? Ví dụ, làm thế nào để sử dụng nó để có được trường hợp ví dụ được hiển thị ở đây (2x2 khối 1, 2, 3)? –