2013-06-18 181 views
1

這看起來很基本,我幾乎不好意思問這個問題,但我無法得到這個工作。什麼是相同的適用於此。這是一個人爲的例子,因爲我想通過它的行和列索引訪問每個單元格的數據,但它很好地代表了這個問題。R:適用於所有矩陣元素

ndat<-matrix(c(1:100), ncol=10) 
for (i in 1:nrow(ndat)) { 
    for (j in 1:ncol(ndat)) { 
     cat(ndat[i,j]," ") 
    } 
    cat("\n") 
} 

這是實際的問題。我正試圖在網格上繪製矩陣。我知道textplot可以繪製矩陣,但我需要更多的網格控制。文本的位置取決於行和列索引。代碼如下:

plot.new() 
tlx <- 0.04 
tly <- 0.96 
label_shift <- 0.04 
text(tlx + label_shift, tly, "Columns", cex=1, adj=c(0,0)) 
text(tlx, tly - label_shift, "Rows", cex=1, adj=c(0,1), srt=-90) 
ndat<-matrix(c(1:100), ncol=10) 
dimnames(ndat) <- list(paste("R",1:10,sep=""), paste("C",1:10,sep="")) 
row_name_space <- 0.1 
col_name_space <- 0.1 
data_width <- 0.075 
data_height <- 0.075 
x1 <- 1.5 * tlx 
x2 <- x1 + row_name_space + ncol(ndat) * data_width 
y1 <- tly - 0.5*tlx 
y2 <- y1 - col_name_space - nrow(ndat) * data_height 
lines(c(x1,x1), c(y1,y2)) 
lines(c(x1,x2), c(y1,y1)) 
vertical_lseg <- function(n) { 
     lx <- x1 + row_name_space + (n - 1) * data_width 
     xv <- c(lx, lx) 
     yv <- c(y1, y2) 
     lines (xv, yv) 
} 
sapply(1:(ncol(ndat)+1), vertical_lseg) 
horizontal_lseg <- function(n) { 
     ly <- y1 - col_name_space - (n - 1) * data_height 
     xv <- c(x1, x2) 
     yv <- c(ly, ly) 
     lines (xv, yv) 
} 
sapply(1:(nrow(ndat)+1), horizontal_lseg) 
sapply(1:nrow(ndat), function(x) text(1.5 * tlx + row_name_space/2, tly - 0.5*tlx - col_name_space - (x - 0.5) * data_height, rownames(ndat)[x], adj=c(0.5,0.5), cex=1)) 
sapply(1:ncol(ndat), function(x) text(1.5*tlx + col_name_space + (x - 0.5) * data_width, tly - 0.5*tlx - col_name_space /2, colnames(ndat)[x], adj=c(0.5,0.5), cex=1)) 
# This is where the text would be plotted. The calculation of x and y is right but the number of elements that outer produces seems to be 10,000 
# rather than 100 
outer(1:nrow(ndat), 1:ncol(ndat), FUN=function(r,c) text(1.5*tlx + col_name_space + (c - 0.5) * data_width, 
                 tly - 0.5*tlx - col_name_space - (r - 0.5) * data_height, 
                 toString(ndat[r,c]), adj=c(0.5,0.5), cex=1)) 
+1

正確的答案將取決於你正在嘗試做什麼。那麼,你能告訴我們你正在做的沒有人爲的問題嗎? – asb

回答

4

?apply

MARGIN:給該函數將是 施加在標a矢量。例如,對於矩陣'1'指示行,'2' 指示列,'c(1,2)'指示行和列。 其中'X'命名了暗號,它可以是一個字符向量 選擇尺寸名稱。

所以,你想:

ndat<-matrix(c(1:100), ncol=10) 
apply(ndat, 1:2, cat) 
+0

謝謝@Joshua。正如我上面用更真實的代碼所解釋的,我確實需要訪問矩陣的索引。捕捉矩陣的最初例子是我能想到的最簡單的例子來說明問題。 –

+0

然後只需使用for循環。 'sapply'和'outer'被設計爲每次迭代返回一些東西,但是你只是用它們來產生副作用,這正是for循環的目的。 –

2

你在做什麼,可以模擬成這樣:

apply(ndat, 1, function (k) cat(k, "\n")) 
3

很難不知道你想做的事說了,但矩陣是向量與尺寸。所以量化功能往往會工作得很好,可以直接使用:

ndat<-matrix(c(1:100), ncol=10) 
ndat^2 

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
[1,] 1 121 441 961 1681 2601 3721 5041 6561 8281 
[2,] 4 144 484 1024 1764 2704 3844 5184 6724 8464 
[3,] 9 169 529 1089 1849 2809 3969 5329 6889 8649 
[4,] 16 196 576 1156 1936 2916 4096 5476 7056 8836 
[5,] 25 225 625 1225 2025 3025 4225 5625 7225 9025 
[6,] 36 256 676 1296 2116 3136 4356 5776 7396 9216 
[7,] 49 289 729 1369 2209 3249 4489 5929 7569 9409 
[8,] 64 324 784 1444 2304 3364 4624 6084 7744 9604 
[9,] 81 361 841 1521 2401 3481 4761 6241 7921 9801 
[10,] 100 400 900 1600 2500 3600 4900 6400 8100 10000 

我之所以提到這一點,是有可能顯着上漲的速度,以這種方式做對比apply

+0

好的。矩陣代數必然比其他任何東西都快。 – asb

+1

+1 - 讓我們再提一下'col(ndat)'和'row(ndat)'作爲這個向量化函數的潛在輸入,以防它必須使用OP所謂的'i'和'j'。 – flodel