r - 矩阵中除对角线以外的所有元素都大于0的情况下,将矩阵中的负元素添加到整行

标签 r matrix

根据我的老问题Substract negative matrix element row wise from diagonal in R ,我在那里搜索了一种将负元素添加到对角线的方法:

我现在寻找一种方法,将所有负元素(除了对角线)设置为0,并在所有值(除了对角线)都大于/等于0的条件下从整行中减去它们的值。

行 Sums 再次应为 0。

p <- matrix(c(-0.3,0.2,0.2,-0.1, 0.1,-0.4,0.4,-0.1, 0.2,-0.1,-0.4,0.3, -0.1,0.2,0.1,-0.2), ncol = 4, byrow = TRUE)

> p
     [,1] [,2] [,3] [,4]
[1,] -0.3  0.2  0.2 -0.1
[2,]  0.1 -0.4  0.4 -0.1
[3,]  0.2 -0.1 -0.4  0.3
[4,] -0.1  0.2  0.1 -0.2

这应该会产生一个像这样的矩阵:

> p.result
       [,1]   [,2]   [,3]   [,4]
[1,] -0.333  0.167  0.167  0.000
[2,]  0.067 -0.433  0.367  0.000
[3,]  0.167  0.000 -0.433  0.267
[4,]  0.000  0.167  0.067 -0.233

最佳答案

#matrix of indicators, TRUE = off-diagonal negatives
ind <- row(p) != col(p) & p < 0

#vector of values to subtract from each row normalised to make sure row sums are still 1
subs <- rowSums(replace(p, !ind, 0))/rowSums(!ind)
p <- t(t(p) + subs)
p[ind] <- 0

p
            [,1]       [,2]        [,3]       [,4]
[1,] -0.33333333  0.1666667  0.16666667  0.0000000
[2,]  0.06666667 -0.4333333  0.36666667  0.0000000
[3,]  0.16666667  0.0000000 -0.43333333  0.2666667
[4,]  0.00000000  0.1666667  0.06666667 -0.2333333

您可以根据需要舍入新矩阵中的条目。

关于r - 矩阵中除对角线以外的所有元素都大于0的情况下,将矩阵中的负元素添加到整行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32047995/

相关文章:

r - 如何将引号粘贴到 R 中的字符串(在列中)?

python - 如何在 Python 3 中从 R 重现基于 SHA256 的 HMAC

java - 在 Opengl 中使用 theta 和 phi 角度进行旋转

检查矩阵中的行数是否等于 c 中的给定行数

r - 如何读取 coplot() 图

r - 用条件估算值单元格

R:自动连接合并后创建的带有后缀的变量

java - 查找矩阵中所有可能的唯一数组

matrix - 行优先顺序对于矩阵向量乘法是否更有效?

c++ - 计算总能量