我有两个矩阵,我想彼此相乘。如果矩阵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
答案 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
的行中的条目为0
或1
,请将该条目乘以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