簡體   English   中英

核矩陣上的R行運算

[英]R row operations on kernel matrix

我有一個內核矩陣,如下所示:

kern <- matrix(c(1,0,0,1,0,0,0,1,1,0,1,1,0,0,1,0,0,1), dimnames=list(c("r1", "r1", "r3"), c("c1a", "c1b", "c2a", "c2b", "c3a", "c3b")), ncol=6, nrow=3)

> kern
   c1a c1b c2a c2b c3a c3b
r1   1   1   0   0   0   0
r2   0   0   1   1   0   0
r3   0   0   1   1   1   1

現在,我想應用行操作,使kern[,c("c1b", "c2b", "c3b")]為單位矩陣。 我知道,通過從第三行減去第二行可以輕松實現:

kern[3,] = kern[3,] - kern[2,]

但是R中有一個函數對我有用嗎? 我不需要在另一個線程中發布的用於減少行梯形表格的功能。


編輯

我有一個笨拙的解決方案

sub <- kern[,c("c1b", "c2b", "c3b")]

for (i in which(colnames(kern) %in% colnames(sub))){
  ##identify which columns have more than one entry
  nonzero.row.idx <- which(kern[,i] != 0)
  while(length(nonzero.row.idx) > 1){    
    row.combinations <- combn(nonzero.row.idx, 2)
    for (j in ncol(row.combinations)){
      r1.idx <- row.combinations[1,j]
      r2.idx <- row.combinations[2,j]
      r1 <- kern[r1.idx,]
      r2 <- kern[r2.idx,]
      if (min(r1 - r2) >=0)
        kern[r1.idx, ] <- r1-r2
      else if (min(r2 - r1) >=0)
        kern[r2.idx, ] <- r2-r1
      else
        stop("Producing negative entries in row")      
      nonzero.row.idx <- which(kern[,i] != 0)
    }
  }
}      

kern[,c("c1b", "c2b", "c3b")]

我也忘記提及我不希望kern任何條目都為負數。 該代碼適用於我的一些示例,但是,它很容易給其他許多矩陣帶來麻煩。

您的分配箭頭指向錯誤的方向。

kern <-  matrix(c(1,0,0,1,0,0,0,1,1,0,1,1,0,0,1,0,0,1), 
           dimnames=list(c("r1", "r1", "r3"), 
                         c("c1a", "c1b", "c2a", "c2b", "c3a", "c3b")),
           ncol=6, nrow=3)
sub <- kern[,c("c1b", "c2b", "c3b")]

您可以嘗試復制您的大腦(或至少是我的大腦)在被要求找到正確的行以從具有離軸非零條目的行中減去時所做的事情:

id <- which( sub != 0 & row(sub) != col(sub), arr.ind=TRUE)
id
#   row col
#r3   3   2

> sub[ id[ ,"row" ], ] <- sub[id[ ,"row" ] , ] - sub[id[, "col" ], ]
> sub
   c1b c2b c3b
r1   1   0   0
r1   0   1   0
r3   0   0   1

暫無
暫無

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

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