乘以矩阵,以第一矩阵中元素的值为条件

时间:2016-06-08 13:51:36

标签: r matrix

我有两个矩阵,我想彼此相乘。如果矩阵1具有编码为0或1的对象,那么简单的产品就足够了。但是,如果矩阵1的元素编码为2,那么我想用相应的矩阵2元素的平方替换这些元素。

Matrix 1

    id1 id2 id3 id4 id5
row1 0   2   2  1   2
row2 1   1   2  0   2 
row3 2   0   1  2   1

Matrix 2

     id1 id2 id3 id4 id5
row1 0.8 1.1 2.1 1.4 1.3

EDIT ::

产品矩阵如下所示:

Matrix 3

     id1  id2 id3 id4  id5

row1  0   1.2 4.4 1.4 1.69
row2  0.8 1.1 4.4  0  1.69
row3  0.64 0  2.1 1.96 1.3

3 个答案:

答案 0 :(得分:2)

我认为以下内容将产生所需的输出

tempVec <- as.vector(t(mat1))
newVec <- ((tempVec == 2) * (mat2^2)) + ((tempVec == 1) * mat2)

newMat <- t(matrix(newVec, length(mat2)))

这会产生输出:

> newMat
     [,1] [,2] [,3] [,4] [,5]
[1,] 0.00 1.21 4.41 1.40 1.69
[2,] 0.80 1.10 4.41 0.00 1.69
[3,] 0.64 0.00 2.10 1.96 1.30

数据

mat1 <- read.table(header=T, text="   id1 id2 id3 id4 id5
0   2   2  1   2
1   1   2  0   2 
2   0   1  2   1")
mat1 <- as.matrix(mat1)

mat2 <- c(0.8, 1.1, 2.1, 1.4, 1.3)

答案 1 :(得分:2)

这是我的解决方案,
为了从简单的逐元素乘法中受益,我们创建了一个名为m_tmp的临时矩阵,它具有与m1相同的维度,并在行中明确填充m2

a=which(m1==2, arr.ind = T)    # find those indices in which 2 is placed
m1[a]=m_tmp[a]      # this will reflect the square in the next line      
m1=m1*m_tmp

产生此输出:

> m1
     [,1] [,2] [,3] [,4] [,5]
[1,] 0.00 1.21 4.41 1.40 1.69
[2,] 0.80 1.10 4.41 0.00 1.69
[3,] 0.64 0.00 2.10 1.96 1.30

数据

m1=structure(c(0, 1, 2, 2, 1, 0, 2, 2, 1, 1, 0, 2, 2, 2, 1), .Dim = c(3L, 5L))
m2=structure(c(0.8, 1.1, 2.1, 1.4, 1.3), .Dim = c(1L, 5L))
m_tmp=matrix(m2, 3, 5, byrow = T)

答案 2 :(得分:2)

 m1 <- structure(c(0, 1, 2, 2, 1, 0, 2, 2, 1, 1, 0, 2, 2, 2, 1), .Dim = c(3L, 5L))
 m2 <- structure(c(0.8, 1.1, 2.1, 1.4, 1.3), .Dim = c(1L, 5L))

一般来说,您的想法是采取产品。您的规则可能会这样解释:

  

如果来自m1的行中的条目为01,请将该条目乘以m2中相应的组件。如果来自m1的行中的条目为2,则将其相应的组件与m2次自身相乘。

所以我认为您只需要将每行的乘积m2取为2行的条目替换为m2的相应条目(即平方)那些条目)。我在这里使用apply()

m3 <- apply(m1, 1, function(row){
   equals2 <- row==2
   row[equals2] <- m2[equals2]
   row*m2
 })

## dont forget to transpose
m3 <- t(m3)

最终产品:

> m3
     [,1] [,2] [,3] [,4] [,5]
[1,] 0.00 1.21 4.41 1.40 1.69
[2,] 0.80 1.10 4.41 0.00 1.69
[3,] 0.64 0.00 2.10 1.96 1.30