我想应用两个函数,一个是块对角线上的函数,另一个是数据框中非对角线元素上的函数

Jis*_*ika 8 r block matrix diagonal

df<- data.frame(a=c(1:10), b=c(21:30),c=c(1:10), d=c(14:23),e=c(11:20),f=c(-6:-15),g=c(11:20),h=c(-14:-23),i=c(4:13),j=c(1:10))
Run Code Online (Sandbox Code Playgroud)

在这个数据框中,我有三个块对角矩阵,如下图所示 在此处输入图片说明

我想应用两个函数,一个是块对角线的正弦函数,第二个是其他元素的余弦函数并生成相同结构的数据框。

sin(df[1:2,1:2])
sin(df[3:5,3:5])
sin(df[6:10,6:10])
cos(the rest of the elements)
Run Code Online (Sandbox Code Playgroud)

G. *_*eck 7

1) 外/算术创建一个逻辑块对角矩阵,指示当前单元格是否在块对角线上,然后使用它来获取 sin 和 cos 值的凸组合,如下所示:

v <- rep(1:3, c(2, 3, 5))
ind <- outer(v, v, `==`)
ind * sin(df) + (!ind) * cos(df)
Run Code Online (Sandbox Code Playgroud)

2) ifelse或者,这给出了一个矩阵结果(或在上面使用 as.matrix )。ind 来自上面。

m <- as.matrix(df)
ifelse(ind, sin(m), cos(m))
Run Code Online (Sandbox Code Playgroud)

3) Matrix::bdiag另一种方法是在Matrix 包中使用bdiag(R 自带——无需安装)。

library(Matrix)

ones <- function(n) matrix(1, n, n)
ind <- bdiag(ones(2), ones(3), ones(5)) == 1
Run Code Online (Sandbox Code Playgroud)

现在按照 (1) 或 (2) 的最后一行继续操作。