2011-11-02 69 views
6

Có ai biết một cách gọn gàng/hiệu quả để thay thế các phần tử chéo trong mảng, tương tự như việc sử dụng diag(x) <- value cho ma trận không? Nói cách khác một cái gì đó như thế này:thay thế các phần tử chéo trong một mảng

> m<-array(1:27,c(3,3,3)) 
> for(k in 1:3){ 
+ diag(m[,,k])<-5 
+ } 
> m 
, , 1 

    [,1] [,2] [,3] 
[1,] 5 4 7 
[2,] 2 5 8 
[3,] 3 6 5 

, , 2 

[,1] [,2] [,3] 
[1,] 5 13 16 
[2,] 11 5 17 
[3,] 12 15 5 

, , 3 

    [,1] [,2] [,3] 
[1,] 5 22 25 
[2,] 20 5 26 
[3,] 21 24 5 

nhưng không sử dụng vòng lặp (mảng của tôi khá lớn và thao tác này sẽ nằm trong vòng lặp).

Rất cám ơn.

Trả lời

6

Hãy thử điều này:

with(expand.grid(a = 1:3, b = 1:3), replace(m, cbind(a, a, b), 5)) 

EDIT:

Các câu hỏi yêu cầu gọn gàng/hiệu quả nhưng, tất nhiên, những người không phải là những điều tương tự. Một trong những lớp lót ở đây là nhỏ gọn và loop-miễn phí nhưng nếu bạn đang tìm kiếm tốc độ tôi nghĩ rằng bạn sẽ thấy rằng vòng lặp trong câu hỏi thực sự là nhanh nhất của tất cả các câu trả lời.

+0

+1 rất đẹp. Nó nhanh hơn mã chức năng của tôi. –

+0

làm việc tốt, chúc mừng! – gjabel

5

Bạn có thể sử dụng chức năng sau cho điều đó, miễn là bạn chỉ có 3 thứ nguyên trong mảng của mình. Bạn có thể khái quát đến hơn kích thước dựa trên mã này, nhưng tôi quá lười biếng để làm điều đó cho bạn ;-)

`arraydiag<-` <- function(x,value){ 
    dims <- dim(x) 
    id <- seq_len(dims[1]) + 
     dims[2]*(seq_len(dims[2])-1) 
    id <- outer(id,(seq_len(dims[3])-1)*prod(dims[1:2]),`+`) 
    x[id] <- value 
    dim(x) <- dims 
    x 
} 

này hoạt động như:

m<-array(1:36,c(3,3,4)) 
arraydiag(m)<-NA 
m 

Lưu ý rằng, trái với diag() chức năng, chức năng này không thể đối phó với ma trận không vuông. Bạn có thể xem mã nguồn của diag() để tìm hiểu cách điều chỉnh mã này theo thứ tự.

+0

tuyệt vời, hãy xử lý! – gjabel

3
diagArr <- 
function (dim) 
{ 
    n <- dim[2] 
    if(dim[1] != n) stop("expecting first two dimensions to be equal") 
    d <- seq(1, n*n, by=n+1) 
    as.vector(outer(d, seq(0, by=n*n, length=prod(dim[-1:-2])), "+")) 
} 

m[diagArr(dim(m))] <- 5 

Điều này được viết với ý định rằng nó hoạt động cho các kích thước cao hơn 3 nhưng tôi chưa thử nghiệm trong trường hợp đó. Nên được okay mặc dù.

+0

Nó không tạo ra một ma trận đường chéo trên độ mờ> 2. Nó tạo ra nhiều ma trận đường chéo n x n. – papirrin

Các vấn đề liên quan