我真的不知道该怎么称呼!
我正在尝试在R中实现以下公式。您几乎可以忽略一切,除了该行上方的求和部分
如果我有两个矩阵
> task2
[,1] [,2] [,3]
[1,] 1 3 3
[2,] 2 5 1
> actor
[,1] [,2] [,3]
[1,] 1 5 1
[2,] 2 4 6
[3,] 4 3 4
结果矩阵应为(对于该行上方的求和部分)
> result
[,1] [,2] [,3]
[1,] 1 0 0
[2,] 4 1 1
结果[1,1] = sum(pmax(0,1-1),pmax(0,3-2),pmax(0,3-4)= 1
我想我知道如何使用嵌套的for循环来做到这一点,尽管我知道那不是您在R中的实现方式。这是不正确的,但应该遵循这样的思路
for (i in 1:nrow(task)){
for (j in 1:ncol(actor)){
for (k in 1:ncol(task)){
result[i,j] <- sum(pmax(0,(task[i,k]-actor[k,j))
}
}
}
有人对如何解决此问题有任何建议吗?
根据示例中显示的逻辑,这应该可以工作。请对照您引用的公式检查所需的输出。准确的结果取决于要与nxp矩阵进行比较的第一个mxn矩阵,因此矩阵一的列等于矩阵二的行:
t(apply(task2, 1, function(x) {
colSums(matrix(pmax(0,x-actor), ncol=ncol(task2)))
}))
# [,1] [,2] [,3]
# [1,] 1 0 0
# [2,] 4 1 1
更新
解释该函数正在执行的操作有助于一次运行一行:
#The generalized function
function(x) {
colSums(matrix(pmax(0,x-actor), ncol=ncol(task2)))
}
仅通过替换为以下task2[1,]
位置将其应用于第一行x
:
colSums(matrix(pmax(0, task2[1,] - actor), ncol=ncol(task2)))
[1] 1 0 0
我们正在创建一个新矩阵并采用列总和。让我们更详细地了解它。在函数的核心,我们将的第一行task2
与矩阵进行比较actor
:
task2[1,] - actor
X..1. X..2. X..3.
[1,] 0 -4 0
[2,] 1 -1 -3
[3,] -1 0 -1
这是最重要的部分。它根据需要减去矩阵。其余所有代码都是使它看起来不错的一种方法。
当我们添加pmax
上面具有的漂亮矩阵时,它变成一个向量:
pmax(0, task2[1,] - actor)
[1] 0 1 0 0 0 0 0 0 0
数字是正确的,但是看起来像这样我们无法获得每一列的总和。因此,我们将其转换为具有相同列数的矩阵,其中:
matrix(pmax(0, task2[1,] - actor), ncol=ncol(task2))
[,1] [,2] [,3]
[1,] 0 0 0
[2,] 1 0 0
[3,] 0 0 0
现在,它是我们需要的形式。但是我们只需要每一列的总和,所以我们添加colSums
:
colSums(matrix(pmax(0, task2[1,] - actor), ncol=ncol(task2)))
[1] 1 0 0
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句