我无法弄清楚,如何编写以下矩阵和数组乘法的矢量化版本:
var mapped = Mapper.Map<FooDTO>(foo, opt => { levels: 0 });
// result = { Baz: "" }
var mapped = Mapper.Map<FooDTO>(foo, opt => { levels: 1 });
// result = { Baz: "", Bars: [{ Blah: "" }] }
var mapped = Mapper.Map<FooDTO>(foo, opt => { levels: 2 });
// result = { Baz: "", Bars: [{ Blah: "", Buzz: [{ Baz: "" }] }] }
// etc...
有人可以帮忙吗?
答案 0 :(得分:3)
我们面临的问题是我们希望在P
上进行矩阵乘法,即array
。由于这不可能有效,最好将此array
转换为第2列matrix
。
P <- array(1:12, dim = c(2, 2, 3))
P <- matrix(P, nrow = 2)
不需要调整A
和R
矩阵才能使其正常工作
A <- matrix(0.25, nrow = 2, ncol = 3)
R <- matrix(-1, nrow = 2, ncol = 3)
然后可以通过将列向量转换为具有来自v
包的bdiag(...)
函数的稀疏块对角矩阵来实现与Matrix
向量的矩阵乘法。
library(Matrix)
v <- rep(0.1, 2)
v <- bdiag(v, v, v)
## [1,] 0.1 . .
## [2,] 0.1 . .
## [3,] . 0.1 .
## [4,] . 0.1 .
## [5,] . . 0.1
## [6,] . . 0.1
这给出了与之前相同的结果,但这次是以矢量化的方式。
v <- rowSums(A * (R + (P %*% v)))
## [1] 0.15 0.30
编辑:在上面的等式中,我使用两种类型的乘法:*
,即点积,它计算两个大小相等的矩阵之间的元素乘积,{ {1}},普通矩阵乘积,它计算两个适形矩阵的矩阵乘积,换句话说,第一个矩阵的列数和第二个矩阵的行数应相等。
Edit2:根据要求,我已经包含了如何将给定的%*%
P
转换为array
。
Edit3:可以通过为组数引入变量matrix
来推广此方法。关键调整是在块对角矩阵的声明中,作为单个矩阵的旁边,该函数还将矩阵列表作为输入。这导致以下解决方案
n