簡體   English   中英

用固定值替換非對角線元素

[英]Replacing off-diagonal elements with a fixed value

我有一個square matrix ,現在我想用一個固定值替換它所有的非對角線元素。 在 R 中的替換矩陣中的非對角線元素中討論了如何做到這一點的一些方法(希望這次問得更好)

例如,

m <- matrix(c(1,2,3,4,3,9,5,5,8),ncol=3)
m[upper.tri(m) | lower.tri(m)] <- 999
m

我想知道是否可以使用dplyr chain rule來執行該步驟,例如

library(dplyr)
matrix(c(1,2,3,4,3,9,5,5,8),ncol=3) %>%
 ### add this -> m[upper.tri(m) | lower.tri(m)] <- 999

任何指針都會非常有幫助

如果為了簡潔起見,您可以在管道中定義+應用匿名 function,如下所示:

matrix(c(1,2,3,4,3,9,5,5,8),ncol=3) %>%
  (\(.) {.[upper.tri(.) | lower.tri(.)] = 999; .})() %>%
## rest of pipeline

ifelse

ifelse(row(m) == col(m), m, 999)

我們可能會使用

matrix(c(1,2,3,4,3,9,5,5,8),ncol=3) %>%
   `[<-`(upper.tri(.) | lower.tri(.), 999)

-輸出

      [,1] [,2] [,3]
[1,]    1  999  999
[2,]  999    3  999
[3,]  999  999    8

您可以使用 dplyr 中的 mutate function 來修改矩陣的元素。 以下是如何執行此操作的示例:

library(dplyr)

m <- matrix(c(1,2,3,4,3,9,5,5,8), ncol = 3)

m %>%
  mutate(m = ifelse(upper.tri(m) | lower.tri(m), 999, m))

這將創建一個新矩陣,其維度與 m 相同,但非對角線元素替換為 999。

或者,您可以使用替換 function 直接修改原始矩陣 m:

m[upper.tri(m) | lower.tri(m)] <- 999

這將修改原始矩陣 m 並將非對角線元素替換為 999。

對於足夠大的mn ,使用等於r的所有元素初始化m × n結果並僅替換對角元素會更有效:

m <- 1000L
n <- 1000L
r <- -1L
x <- diag(seq_len(min(m, n)), m, n)

microbenchmark::microbenchmark(
    A = x |> (\(.) `diag<-`(array(r, dim(.), dimnames(.)), diag(., names = FALSE)))(),
    B = x |> (\(.) `[<-`(., row(.) != col(.), r))(),
    C = x |> (\(.) `[<-`(., upper.tri(.) | lower.tri(.), r))(),
    times = 1000L)
Unit: microseconds
 expr      min         lq       mean    median        uq      max neval
    A   67.445   283.2075   520.3644   315.823   343.498 12723.82  1000
    B 4475.232  5024.3450  5750.4401  5479.527  6081.837 16821.36  1000
    C 8863.134 10034.4835 11035.8599 10535.052 11030.066 22211.34  1000

我們可以嘗試像下面這樣的管道

matrix(c(1, 2, 3, 4, 3, 9, 5, 5, 8), ncol = 3) %>%
  {
    999 * (!diag(nrow(.))) + diag(.)
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM