我真的不知道怎么称呼这个!
我正在尝试在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] =总和(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))
}
}
}
有没有人对如何解决这个问题有任何建议?
答案 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)))