【问题标题】:Modify L-shaped section of matrix in R在R中修改矩阵的L形截面
【发布时间】:2022-11-15 20:51:14
【问题描述】:

我有一个方阵,我希望对一些外部行和列中的所有值做一些事情,例如将 abmat 中的行和列 g:j 中的所有内容乘以 10:

abmat <-matrix(
  data = rpois(n = 10*10, lambda = 1),
  nrow = 10,
  dimnames = list(letters[1:10], letters[1:10])
)

abmat
#>   a b c d e f g h i j
#> a 0 2 2 1 0 0 0 1 1 2
#> b 2 1 2 2 0 1 0 0 1 1
#> c 1 0 1 2 0 2 2 1 1 0
#> d 0 2 0 0 1 3 1 1 3 1
#> e 0 0 1 1 3 2 1 1 1 0
#> f 1 1 1 1 2 0 2 1 0 1
#> g 0 0 2 1 0 0 0 0 1 3
#> h 0 2 2 0 1 0 2 1 1 1
#> i 1 1 0 2 0 0 2 1 0 1
#> j 0 0 2 0 0 0 1 1 2 1

似乎我可以通过排除来排除,但实际上这排除了指定行/列中的所有内容,所以只给出底角,而不是我想要的向后 L 部分:

abmat[-1:-6, -1:-6]*10
#>    g  h  i  j
#> g  0  0 10 30
#> h 20 10 10 10
#> i 20 10  0 10
#> j 10 10 20 10
#no

我可以通过分解它并在两个不同形状的部分上操作来创建反向 L:

abmat2 <- abmat
abmat2[7:10,] <- abmat[7:10,]*10
abmat2[1:6, 7:10] <- abmat[1:6, 7:10]*10

abmat2
#>    a  b  c  d  e f  g  h  i  j
#> a  0  2  2  1  0 0  0 10 10 20
#> b  2  1  2  2  0 1  0  0 10 10
#> c  1  0  1  2  0 2 20 10 10  0
#> d  0  2  0  0  1 3 10 10 30 10
#> e  0  0  1  1  3 2 10 10 10  0
#> f  1  1  1  1  2 0 20 10  0 10
#> g  0  0 20 10  0 0  0  0 10 30
#> h  0 20 20  0 10 0 20 10 10 10
#> i 10 10  0 20  0 0 20 10  0 10
#> j  0  0 20  0  0 0 10 10 20 10
#yes

是的,工作,但有点繁琐 - 有没有更直接的方法来做到这一点?

reprex package (v2.0.1) 于 2022 年 11 月 11 日创建

【问题讨论】:

    标签: r


    【解决方案1】:

    这是正方形 n*n 矩阵 x 的一个通用实现,您希望将行 r:n 或列 r:n 中的所有元素乘以标量值 m

    虽然我不确定它是否比你的方法更简单

    myfun <- function(x, r, m) {
        vec <- c(rep(1, r-1), rep(2, nrow(x)-r+1))
        tf <- tcrossprod(vec) > 1
        x*(!tf) + x*tf*m
    }
    
    myfun(x=abmat, r=7, m=10)
    
    #    a  b  c  d  e  f  g  h  i  j
    # a  0  0  2  3  2  0 10  0  0 20
    # b  1  2  1  0  0  1 10  0  0 10
    # c  1  2  0  2  0  2 20 10 10 10
    # d  2  1  0  1  1  0  0 10 20  0
    # e  1  0  2  0  4  0 10  0  0 20
    # f  2  0  2  1  0  2 20  0  0  0
    # g  0 10 10 10  0 10 10 10  0 20
    # h  0  0 10  0 30  0  0 10 20  0
    # i 20  0 10 50  0  0 20 10  0 10
    # j  0  0 10 20 10 20 20 20 10 20
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-14
      • 2015-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-03
      • 1970-01-01
      • 2018-09-27
      相关资源
      最近更新 更多