-3
A
回答
2
適用於非方陣,以及:
diag2 <- function(x){
n <- min(dim(x))
return(x[matrix(rep(1:n, 2), n, 2)])
}
另外,如果你看一下diag
你可以看到發生了什麼事情:
if (is.matrix(x)) {
if (nargs() > 1L)
stop("'nrow' or 'ncol' cannot be specified when 'x' is a matrix")
if ((m <- min(dim(x))) == 0L)
return(vector(typeof(x), 0L))
y <- x[1 + 0L:(m - 1L) * (dim(x)[1L] + 1)]
nms <- dimnames(x)
if (is.list(nms) && !any(sapply(nms, is.null)) && identical((nm <- nms[[1L]][seq_len(m)]),
nms[[2L]][seq_len(m)]))
names(y) <- nm
return(y)
}
## there's more...
如果任何人的好奇,我試圖基準,包括@ shayaa的方法...
set.seed(101)
a <- matrix(runif(1e6), 1e3, 1e3)
diag3 <- function(x){
x[row(x) == col(x)]
}
library(microbenchmark)
microbenchmark(diag(a), diag2(a), diag3(a))
## Unit: microseconds
## expr min lq mean median uq max neval
## diag(a) 23.205 33.915 47.59246 47.3030 58.2355 79.878 100
## diag2(a) 31.238 37.262 58.03028 57.5665 70.7300 107.546 100
## diag3(a) 11744.788 12659.595 15425.79847 13874.7265 15054.8285 164130.271 100
+0
對不起,我應該指定該矩陣可能不是一個矩形矩陣 –
+0
我在你評論之前編輯了我的答案,以便它對非方陣也有效 – parksw3
2
set.seed(1111)
df <- matrix(rnorm(16),4,4)
df[row(df)==col(df)]
也工作,如果您的矩陣不是正方形
set.seed(1111); df <- matrix(rnorm(30),5,6)
df[row(df)==col(df)]
相關問題
- 1. 如何使矩陣的對角線等於另一個矩陣的對角線?
- 2. 轉移矩陣元到另一個矩陣的對角線
- 3. 如何獲取矩陣中元素的兩個對角線?
- 4. 寫一個函數來分配一個上三角矩陣
- 5. 如何排序矩陣對角線
- 6. 如何做對角線矩陣
- 7. 如何在Chapel中提取上三角矩陣w或w/o對角線
- 8. 線程如何編寫成矩陣
- 9. 更改矩陣數組的對角線
- 10. 對角線反映矩陣
- 11. matlab:提取大型稀疏矩陣的塊對角線
- 12. 從矩陣的一半創建對角線矩陣
- 13. 如何在MATLAB中重新對角矩陣的對角線?
- 14. 使用R從距離矩陣中提取對角線
- 15. 我該如何構建一個函數來提取R中較大的對角塊矩陣?
- 16. MATLAB:如何通過矩陣的對角線作爲另一個矩陣的參數?
- 17. 如何查找二維矩陣的兩個對角線?
- 18. 與numpy的一個矩陣的對角矩陣,並SciPy的
- 19. 如何在r中給出對角線和非對角線元素的矩陣?
- 20. 矩陣具有相同的對角線
- 21. 矩陣列表的塊對角線
- 22. 主對角線矩陣的總和JAVA
- 23. 矩陣中的對角線-python
- 24. 打印對角線的矩陣
- 25. 矩陣的塊對角線綁定
- 26. 徵:用小矩陣的「對角線」
- 27. 用Mathematica更改矩陣的對角線
- 28. 替換矩陣的對角線
- 29. 從MATLAB矩陣陣列創建對角線矩陣
- 30. 如何在Python中編寫numpy矩陣的函數
'對角線< - 函數(墊){unname(sapply(SEQ(分鐘(暗淡(墊))),函數(I){墊[I,I ]})}'',也許 – alistaire