indice不是我的产品总和

时间:2016-09-01 09:58:29

标签: r function sum

我在R代码中实现以下功能:

formula to be converted into code

到目前为止我用过:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

其中~a是以下模拟矩阵:

sig.TOM <- function(adj, sig.adj) {
out <- matrix(nrow = nrow(adj), ncol = ncol(adj))
  for (i in 1:nrow(adj)) {
    for (j in 1:ncol(adj)) {
      out[i,j] <- abs(adj[i, j] + sum(sig.adj[i, -c(i, j)]*sig.adj[-c(i, j), i]))/(
        min(sum(sig.adj[-i, i]), sum(sig.adj[-j, j])) + 1 - abs(adj[i,j]))
    }
  }
  return(out)
}

sig.adj <- structure(c(1, -0.418913311940584, 1, 0.947013383275973, -1, -0.418913311940584, 1, -0.207962861914701, 0.584386281408348, -0.687223049826016, 1, -0.207962861914701, 1, 0.763551721347657, -0.0327147711077901, 0.947013383275973, 0.584386281408348, 0.763551721347657, 1, 0.284466543760789, -1, -0.687223049826016, -0.0327147711077901, 0.284466543760789, 1), .Dim = c(5L, 5L)) ,其中公式中的adj被描述为a和sig.adj被描述为~a。

但结果并不像预期的那样对称,所以我必须把它错误地实现,我对求和部分有疑问。

当指数不是i或j时,如何实现这些值的乘积?

建议的解决方案:

adj <- abs(sig.adj)

比较每个功能的结果:

spec.mult1 <- function(A,B) {
  rA <- nrow(A); cB <- ncol(B)
  C <- A %*% B
  for (i in 1:rA) for (j in 1:cB) 
    C[i,j] <- C[i,j] - A[i,i]*B[i,j] - A[i,j]*B[j,j] + ifelse(i==j, A[i,i]*B[j,j], 0) 
  C
}

spec.mult2 <- function(A) {
  dA.A <- diag(A)*A
  crossprod(A) - dA.A - t(dA.A) + diag(diag(A)^2)
}

spec.mult3 <- function(A,B) {
  rA <- nrow(A); cB <- ncol(B)
  C <- A %*% B
  for (i in 1:rA) for (j in 1:cB) 
    C[i,j] <- C[i,j] - A[i,i]*B[i,j] - A[i,j]*B[j,j] 
  C
}

spec.mult4 <- function(A) {
  dA.A <- diag(A)*A
  crossprod(A) - dA.A - t(dA.A)
}

spec.mult5 <- function(sig.adj) {
  nr <- nrow(sig.adj); nc <- ncol(sig.adj)
  C <- matrix(NA, nr, nc)
  for (i in 1:nr) for (j in 1:nc) 
    C[i,j] <- sum(sig.adj[i, -c(i, j)]*sig.adj[-c(i, j), j])
  C
}

结果,spec.mult1 == spec.mult2和spec.mult3 == spec.mult4但spec.mult5(我理解的那个,并希望它是正确的)不会出现

2 个答案:

答案 0 :(得分:2)

我认为您在u!=i, j的总和上编入错误。部分

sum(sig.adj[i, -c(i, j)]*sig.adj[-c(i, j), i])

应该是

sum(sig.adj[i, -c(i, j)]*sig.adj[-c(i, j), j])

根据你的例子,输出对我来说是一个对称矩阵。

答案 1 :(得分:0)

$ C_ {ij} = \ sum_ {u} a_ {iu} b_ {uj})$是正常的矩阵乘法。因此,您可以通过更正矩阵乘法的结果(即减去总和中不需要的部分)来获得$ \ sum_ {u \ ne i,j} a_ {iu} b_ {uj} $。 请注意,在 [HttpPost] public ActionResult angus(string json) { var check = json.ToString() == null; return RedirectToAction("ErrorAction"); } 的情况下,只有$ \ sum_ {u} a_ {iu} b_ {uj})$的一部分必须被忽略。

关于省略指标的事情:

i==j

该元素只被省略一次。

特殊矩阵乘法旁边的公式部分很清楚:

A <- matrix(c(1:4, 2,5:7, 3,6,8:9, 4,7,9,10), 4,4)
A[1, -c(1,1)]

(或sig.TOM <- function(sig.adj) { adj <- abs(sig.adj) k <- colSums(adj) - abs(diag(adj)) abs(adj + spec.mult(sig.adj, sig.adj)) / (outer(k,k, pmin) +1 - abs(adj)) } sig.TOM(sig.adj) 表示特殊矩阵乘法的单参数变量,见下文) p.s。:我复制了您问题中的spec.mult(sig.adj)部分,因为我不知道您是否需要... +1 - abs(adj)... +1 - adj

以下是特殊矩阵乘法的五种变体:

... +1 - sig.adj