我在R代码中实现以下功能:
到目前为止我用过:
<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(我理解的那个,并希望它是正确的)不会出现
答案 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