R中的矢量化矩阵和数组乘法

时间:2017-06-04 10:28:58

标签: arrays r matrix vectorization multiplication

我无法弄清楚,如何编写以下矩阵和数组乘法的矢量化版本:

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...

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:3)

我们面临的问题是我们希望在P上进行矩阵乘法,即array。由于这不可能有效,最好将此array转换为第2列matrix

P <- array(1:12, dim = c(2, 2, 3))
P <- matrix(P, nrow = 2)

不需要调整AR矩阵才能使其正常工作

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