在R语言中,如何对矩阵的对角元素施加条件

在R语言中,如何对矩阵的对角元素施加条件,r,matrix,R,Matrix,我在用R语言工作。我想强加一个条件,如果矩阵的任何一个上对角线元素大于0.5,那么它将在输出中打印它 我使用下面的代码,但它打印的不是不需要的对角线元素 for(i in 1:ncol(X)) for (j in i+1:ncol(X)-i){ if(mat(X)[i,j]>0.5) #upper.tri(cor(X),diag=F) cat(i,",",j," th element", " > 50%","\n") } 提前感谢,在这里()应该可以为您工作,使用arr.in

我在用R语言工作。我想强加一个条件,如果矩阵的任何一个上对角线元素大于0.5,那么它将在输出中打印它

我使用下面的代码,但它打印的不是不需要的对角线元素

for(i in 1:ncol(X))

for (j in i+1:ncol(X)-i){
if(mat(X)[i,j]>0.5)

#upper.tri(cor(X),diag=F)

cat(i,",",j," th element", " > 50%","\n")
}
提前感谢
,在这里()
应该可以为您工作,使用
arr.ind
参数返回矩阵索引。如您所想,您可以使用
upper.tri
,以及一个附加的逻辑选择标准(>0.5)来查找符合您描述的元素:

set.seed(3234)
m <- matrix(runif(16),nrow=4)

m
#          [,1]       [,2]      [,3]       [,4]
#[1,] 0.24903346 0.06965592 0.8715103 0.92297359
#[2,] 0.81593852 0.99991663 0.3717652 0.67191551
#[3,] 0.85413490 0.13877853 0.7990082 0.04143296
#[4,] 0.01439058 0.27303603 0.5246000 0.08486883

which(m > 0.5 & upper.tri(m) , arr.ind = TRUE )
#    row col
#[1,]   1   3
#[2,]   1   4
#[3,]   2   4
set.seed(3234)
m 0.5和上三(m),arr.ind=真)
#行列
#[1,]   1   3
#[2,]   1   4
#[3,]   2   4
请注意,默认情况下这不包括对角线,如果要包括对角线,请使用
diag=TRUE
参数,如
,该参数(m>0.5&upper.tri(m,diag=TRUE),arr.ind=TRUE)
which()
应该可以在这里为您工作,使用
arr.ind
参数返回矩阵索引。如您所想,您可以使用
upper.tri
,以及一个附加的逻辑选择标准(>0.5)来查找符合您描述的元素:

set.seed(3234)
m <- matrix(runif(16),nrow=4)

m
#          [,1]       [,2]      [,3]       [,4]
#[1,] 0.24903346 0.06965592 0.8715103 0.92297359
#[2,] 0.81593852 0.99991663 0.3717652 0.67191551
#[3,] 0.85413490 0.13877853 0.7990082 0.04143296
#[4,] 0.01439058 0.27303603 0.5246000 0.08486883

which(m > 0.5 & upper.tri(m) , arr.ind = TRUE )
#    row col
#[1,]   1   3
#[2,]   1   4
#[3,]   2   4
set.seed(3234)
m 0.5和上三(m),arr.ind=真)
#行列
#[1,]   1   3
#[2,]   1   4
#[3,]   2   4
请注意,默认情况下这不包括对角线,如果要包括对角线,请使用
diag=TRUE
参数,如
,该参数(m>0.5&upper.tri(m,diag=TRUE),arr.ind=TRUE)
1)请注意
i+1:ncol(X)-i
等于
1:ncol(X)
,无论
i
(如
i
cancel的两个实例)这可能不是您想要的

2) 还请注意,这可以在没有循环的情况下完成:

# create test matrix
set.seed(123)
m <- matrix(runif(25), 5)

# ix selects large elements
ix <- m > .5 & upper.tri(m)
s <- sprintf("\nm[%d, %d] = %f > 0.5", row(m)[ix], col(m)[ix], m[ix])
上面使用的矩阵
m
是:

> m
          [,1]      [,2]      [,3]       [,4]      [,5]
[1,] 0.2875775 0.0455565 0.9568333 0.89982497 0.8895393
[2,] 0.7883051 0.5281055 0.4533342 0.24608773 0.6928034
[3,] 0.4089769 0.8924190 0.6775706 0.04205953 0.6405068
[4,] 0.8830174 0.5514350 0.5726334 0.32792072 0.9942698
[5,] 0.9404673 0.4566147 0.1029247 0.95450365 0.6557058
1) 请注意,
i+1:ncol(X)-i
等于
1:ncol(X)
,而不考虑
i
(作为
i
取消的两个实例),这可能不是您想要的

2) 还请注意,这可以在没有循环的情况下完成:

# create test matrix
set.seed(123)
m <- matrix(runif(25), 5)

# ix selects large elements
ix <- m > .5 & upper.tri(m)
s <- sprintf("\nm[%d, %d] = %f > 0.5", row(m)[ix], col(m)[ix], m[ix])
上面使用的矩阵
m
是:

> m
          [,1]      [,2]      [,3]       [,4]      [,5]
[1,] 0.2875775 0.0455565 0.9568333 0.89982497 0.8895393
[2,] 0.7883051 0.5281055 0.4533342 0.24608773 0.6928034
[3,] 0.4089769 0.8924190 0.6775706 0.04205953 0.6405068
[4,] 0.8830174 0.5514350 0.5726334 0.32792072 0.9942698
[5,] 0.9404673 0.4566147 0.1029247 0.95450365 0.6557058

请提供可复制的示例。什么是
mat
功能?请提供可复制的示例。什么是
mat
功能?我将格式化和打印详细信息留给OP.+1,以获得完整的解决方案。打印输出的另一种方法是显示
ix*m
。通过这种方式,我可以更轻松地可视化所需值的位置(我知道这不是OP要求的)。@Carl,或者:
print(ifelse(ix,“*”,”),quote=FALSE)
我将格式和打印详细信息留给了OP.+1,以获得一个完整的解决方案。打印输出的另一种方法是显示
ix*m
。通过这种方式,我可以更轻松地可视化所需值的位置(我知道这不是OP要求的)。@Carl,或者:
print(如果else(ix,“*”,”),quote=FALSE)
@imdadullah欢迎您!我建议,因为你似乎是新来这里,你有一个快速浏览和部分的网站,以帮助你得到最大的SO。欢迎来到SO@伊姆达杜拉,不客气!我建议,因为你似乎是新来这里,你有一个快速浏览和部分的网站,以帮助你得到最大的SO。欢迎来到SO!