我有3个向量x,y和z。我想创建一个矩阵,其第(i,j)个条目将是和((x [i] * z + y [j])^ 2)
我正在尝试使用int8_t x = 5; std::cout << +x;
,但我收到了错误消息。这是一个例子:
outer
答案 0 :(得分:1)
您有以下总结:
\sum_{k=1}^n [(x_i*z_k + y_j)^2]
\sum_{k=1}^n [(x_i*z_k)^2 + 2*x_i*z_k*y_j + y_j^2]
\sum_{k=1}^n [(x_i*z_k)^2] + 2*x_i*y_j*\sum_{k=1}^n [z_k] + n*y_j^2
因此,一种有效的方法是使用x
和z
之间的外部产品计算第一个术语,并使用x
和{之间的外部产品计算第二个术语{1}}:
y
虽然您可以使用像outer.sol <- function(x, y, z) {
n <- length(x)
xmult <- rowSums(outer(x, z, function(x, z) (x*z)^2))
matrix(rep(xmult, n), nrow=n) +
outer(x, y, function(x, y) 2*sum(z)*x*y) +
matrix(rep(n*y^2, each=n), nrow=n)
}
outer.sol(x, y, z)
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,] 5.05 6.45 8.05 9.85 11.85 14.05 16.45 19.05 21.85 24.85
# [2,] 17.70 20.20 22.90 25.80 28.90 32.20 35.70 39.40 43.30 47.40
# [3,] 38.05 41.65 45.45 49.45 53.65 58.05 62.65 67.45 72.45 77.65
# [4,] 66.10 70.80 75.70 80.80 86.10 91.60 97.30 103.20 109.30 115.60
# [5,] 101.85 107.65 113.65 119.85 126.25 132.85 139.65 146.65 153.85 161.25
# [6,] 145.30 152.20 159.30 166.60 174.10 181.80 189.70 197.80 206.10 214.60
# [7,] 196.45 204.45 212.65 221.05 229.65 238.45 247.45 256.65 266.05 275.65
# [8,] 255.30 264.40 273.70 283.20 292.90 302.80 312.90 323.20 333.70 344.40
# [9,] 321.85 332.05 342.45 353.05 363.85 374.85 386.05 397.45 409.05 420.85
# [10,] 396.10 407.40 418.90 430.60 442.50 454.60 466.90 479.40 492.10 505.00
这样的循环解决方案来单独计算每个元素,这会使您的代码更易于阅读,但请注意,这将比使用{{1的完全向量化解决方案慢得多}}:
mapply
从评论看来,真正的函数比问题中包含的二次函数更复杂,因此提供的outer
函数是(相当慢)的方法。