r - 如果矩阵值小于 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
解决方案
我认为这应该有效:
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)
推荐阅读
- php - 多 ajax 调用在第一次调用时执行了两次
- image - 如何使用 Flutter 按钮从屏幕上删除选定的视频
- google-analytics - Measurement Protocol 仅在我提供 cid 时跟踪(当我仅提供 uid 时不跟踪)
- python - pdfkit 图像未使用 Django 嵌入
- python - 安装 AssimpCy
- reactjs - React,使用 react-hook-form 提交表单后显示消息
- debugging - 在 IntelliJ 中停止/终止调试线程
- angular - 如果我的内容溢出窗口高度,Angular 如何在底部自动滚动到新添加的元素?适用于整个页面,app
- c - 从单链表中删除元素的一个非常意外的问题
- php - Laravel SHOW WARNINGS 给出无缓冲查询活动错误