两个矩阵之间的元素减法

时间:2016-02-16 15:17:30

标签: r matrix

我真的不知道怎么称呼这个!

我正在尝试在R中实现下面的公式。除了行上方的求和部分之外,你几乎可以忽略所有内容

enter image description here

如果我有两个矩阵

    > 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] =总和(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))
    }
  }
}

有没有人对如何解决这个问题有任何建议?

2 个答案:

答案 0 :(得分:1)

根据您在示例中提供的逻辑,这应该可行。请根据您引用的公式检查所需的输出。准确的结果取决于要与 nxp 矩阵进行比较的第一个 mxn 矩阵,以便矩阵1的列等于矩阵2的行:

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

答案 1 :(得分:1)

定义广义内积。例如,如果#include "Functions.h" #include <iostream> #include <cassert> #include <iterator> #include <string> #include <ctime> #include <cstdlib> #include <stdio.h> #include <stdlib.h> #include <math.h> using namespace std; string createRandomString(int); int main(){ string test; test=createRandomString(1); cout << test; return 0; } string createRandomString(int stringlength){ srand(time(NULL)); string lettersToUse="ABCDEFG"; string newOne=""; for(int i=0;i<=stringlength-1;i++){ srand(time(NULL)); newOne=newOne+lettersToUse[rand() % 7 + 1]; } return newOne; } 则定义矩阵乘法。

f <- function(x, y) sum(x*y)

现在使用适当的功能:

inner <- function(a,b,f) {
    f <- match.fun(f)
    apply(b,2,function(x)apply(a,1,function(y)f(y,x)))
}

,并提供:

inner(task2, actor, function(x, y) sum(pmax(0, x - y)))