2011-10-28 30 views
6

Những gì các nhà phát triển R có kinh nghiệm xem xét cách hiệu quả nhất (nhưng vẫn có thể đọc được) để xây dựng một ma trận với một số hàng và cột nhất định từ một hàm nhất định, chẳng hạn như A_ij = someFun (i, j) với 1 < = i < = hàng, 1 < = j < = cols?Hiệu quả tạo ra một ma trận từ các giá trị hàm

Vì tôi không thể tìm thấy cái gì đó trong tài liệu hướng dẫn tôi đến với

initMatrix <- function(rows, cols, fn) { 
    A <- matrix(nrow=rows, ncol=cols) 
    for (i in 1:rows) 
     for (j in 1:cols) 
      A[i,j] <- fn(i,j) 
    return(A) 
} 

mà có vẻ ngớ ngẩn và chậm đối với tôi. Bất kỳ cải tiến (đặc biệt là một lớp lót) chào đón! :)

Trả lời

7

Tôi nghĩ bạn đang tìm kiếm outer(seq(rows),seq(cols),fn) (hoặc như được đề xuất bên dưới, outer(seq_len(rows),seq_len(cols),fn): sẽ cần một số ví dụ để xem mức độ chênh lệch được tạo ra).

Bạn có thể đạt được nhiều khả năng đọc (ít nhất là nếu bạn không phải tìm kiếm ?outer để tìm hiểu điều gì đang xảy ra) theo cách này, nhưng tôi thực sự không nghĩ bạn tiết kiệm được nhiều thời gian. Một cái gì đó thông minh hơn và hiệu quả hơn có thể là có thể nếu bạn fn được vector hóa để bắt đầu với: là nó?

+1

Hoặc với 'seq_len' khá hơn' seq'. –

+0

Cảm ơn bạn đã trả lời câu hỏi này một cách nhanh chóng! Theo như vectorization của $ fn $ là có liên quan ... tiếc là không. Như bạn có thể đoán tôi là khá mới để R (Tôi đang sử dụng để numpy/scipy, maple, và như thế) đó là lý do tại sao tôi đã không tìm ra cách để vectorize chức năng nào được nêu ra. – fotNelton

6

có một cái nhìn tại outer:

> outer (LETTERS [1:3], letters [4:7], paste) 
    [,1] [,2] [,3] [,4] 
[1,] "A d" "A e" "A f" "A g" 
[2,] "B d" "B e" "B f" "B g" 
[3,] "C d" "C e" "C f" "C g" 
Các vấn đề liên quan