将一个矩阵映射到另一个矩阵位置

时间:2017-02-02 14:30:41

标签: r matrix

我会尽力解释这一点。我有一个数据集,我从中创建一个matix并在其上执行tcrossprod,简化的示例数据集是......

key value
a1  1000
a2  500
a3  1500
a5  200

我的问题出现了,因为我有另一个矩阵,我想缩放我单独计算的原始矩阵,简化的例子是......

    a1  a2  a3  a4  a5
a1  1   5   10  15  50
a2  5   1   20  25  75
a3  10  20  1   30  80
a4  15  25  30  1   100
a5  50  75  80  100 1

我希望将第二个矩阵映射到第一个矩阵,但我无法找到一种方法来实现它,我希望最终得到两个矩阵,我可以将它们相乘,例如,第一个矩阵就是结果对于trcrossprod,第二个矩阵是单独计算的。

这两个矩阵没有相同的尺寸,这就是为什么我要将第二个矩阵的相应值映射到与第一个矩阵相同的维度,所以我有一个简单的标量矩阵计算。

    v1      v2      v3      v4          a1  a2  a3  a4  a5
1,  1000000 500000  1500000 200000      a1  1   5   10  50
2,  500000  250000  750000  100000      a2  5   1   20  75
3,  1500000 750000  2250000 300000      a3  10  20  1   80
4,  200000  100000  300000  40000       a5  50  75  80  1

所以第一个矩阵的键需要在正确的位置映射到第二个矩阵,这样我就可以对matrix_1 * matrix_2进行简单的缩放。

然后我会得到一个看起来像这样的新矩阵......

    v1       v2       v3        v4
1,  1000000  2500000  15000000  10000000
2,  2500000  250000   15000000  7500000
3,  15000000 15000000 2250000   24000000
4,  10000000 7500000  24000000  40000

1 个答案:

答案 0 :(得分:1)

# Reproduce data
df1 <- read.table(header = TRUE, text = "key value
a1  1000
a2  500
a3  1500
a5  200")
v1 <- as.matrix(df1[, 2, drop = FALSE])
rownames(v1) <- df1[[1]]
m1 <- v1 %*% t(v1)

#         a1     a2      a3    a5
# a1 1000000 500000 1500000 2e+05
# a2  500000 250000  750000 1e+05
# a3 1500000 750000 2250000 3e+05
# a5  200000 100000  300000 4e+04

m2 <- as.matrix(read.table(header = TRUE, text = "    a1  a2  a3  a4  a5
a1  1   5   10  15  50
a2  5   1   20  25  75
a3  10  20  1   30  80
a4  15  25  30  1   100
a5  50  75  80  100 1"))


m1 * do.call("[", c(list(m2), dimnames(m1)))

#         a1      a2       a3      a5
# a1 1.0e+06 2.5e+06 15000000 1.0e+07
# a2 2.5e+06 2.5e+05 15000000 7.5e+06
# a3 1.5e+07 1.5e+07  2250000 2.4e+07
# a5 1.0e+07 7.5e+06 24000000 4.0e+04