首页 > 解决方案 > 如果矩阵值小于 0,则乘以

问题描述

我有一个向量 p 和一个矩阵 Z。如果下面第一个等式中的值变为负数,我想将它们乘以缩放因子 sf。我现在已将其应用于第 3 列,但我的真实数据是一个巨大的矩阵,那么我如何编写一个参数来查找所有负值,计算 sf,然后将它们乘以该特定单元格的 sf 方程?

data:

p <- c(12,  10, 5,  8) 

Z <- read.table(header=FALSE, 
text=" 0    5   2   3
2   0   2   1
10  3   0   0
1   2   3   0
")     

code:

p + colSums(Z)-rowSums(Z) #if negative in this equation, then find  scaling factor sf:

sf <- (p[[3]] + colSums(Z[3])) / rowSums(Z[3,]) #scaling factor

(Z[3,]) * sf #multiply the negative value with scaling factor

标签: rmatrixlinear-algebramultiplication

解决方案


我认为这应该有效:

test <- p + colSums(Z) - rowSums(Z)
sf <- (p + colSums(Z)) / rowSums(Z)
multiplier = ifelse(test < 0, sf, 1)
result <- diag(multiplier) %*% as.matrix(Z)

result
#            V1       V2 V3 V4
# [1,] 0.000000 5.000000  2  3
# [2,] 2.000000 0.000000  2  1
# [3,] 9.230769 2.769231  0  0
# [4,] 1.000000 2.000000  3  0

如果你的矩阵真的很大,上面计算行总和和列总和两次是低效的,我们可以通过保存和重用这些结果来改进它:

cs = colSums(Z)
rs = rowSums(Z)
test <- p + cs - rs
sf <- (p + cs) / rs
multiplier = ifelse(test < 0, sf, 1)
result <- diag(multiplier) %*% as.matrix(Z)

推荐阅读