具有从特定值到零的梯度的矩阵

tna*_*ake 3 r matrix

我想创建一个矩阵,它在其"左下角"的角落中具有最大值(例如10),在"右下角"和"左上角"角落0中作为其值.矩阵应填充从最大值到1的值,然后用零填充.

##e.g. start with this
m <- matrix(ncol = 10, nrow = 10)
m[,1] <- 1:10
m[10, ] <- 10:1
Run Code Online (Sandbox Code Playgroud)

类似地填充矩阵的最有效方法是什么?

## 1 0 0 0
## 2 1 0 0 
## 3 2 1 0
## 4 3 2 1 
Run Code Online (Sandbox Code Playgroud)

Vin*_*mot 7

根据我的理解,可以这样做,例如:

n <- 4
sapply((n:1)-1, "+", 1:n)

#      [,1] [,2] [,3] [,4]
# [1,]    4    3    2    1
# [2,]    5    4    3    2
# [3,]    6    5    4    3
# [4,]    7    6    5    4
Run Code Online (Sandbox Code Playgroud)

它也可以看作是Toeplitz矩阵的一部分,见?toeplitz.


我误解了解释!这个例子帮了很多忙.为了匹配该示例,存在许多可能的解决方案.

解决方案1 toeplitz

n <- 4
M <- toeplitz(1:n)
M[upper.tri(M)] <- 0
M

#      [,1] [,2] [,3] [,4]
# [1,]    1    0    0    0
# [2,]    2    1    0    0
# [3,]    3    2    1    0
# [4,]    4    3    2    1
Run Code Online (Sandbox Code Playgroud)

解决方案2用sapplypmax

sapply((1:n)-1, function(i)  pmax((1:n)-i, 0) )

#      [,1] [,2] [,3] [,4]
# [1,]    1    0    0    0
# [2,]    2    1    0    0
# [3,]    3    2    1    0
# [4,]    4    3    2    1
Run Code Online (Sandbox Code Playgroud)

注意:稍加调整,pmax可以放在外面sapply,如pmax(-sapply((1:n)-1, "-", 1:n),0).


bap*_*ste 5

m[lower.tri(m, diag = T)] <- sequence(10:1)
Run Code Online (Sandbox Code Playgroud)