【问题标题】:Multiply matrices conditional on the value of the element in the first matrix以第一个矩阵中元素的值为条件的矩阵相乘
【发布时间】:2016-06-08 13:51:35
【问题描述】:

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

矩阵 1

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

矩阵 2

     id1 id2 id3 id4 id5
row1 0.8 1.1 2.1 1.4 1.3

编辑::

产品矩阵如下所示:

矩阵 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

【问题讨论】:

  • 我有点困惑你所说的“对象”是什么意思。你是说矩阵的元素吗?当你说矩阵乘法时,你是指逐元素乘法还是真正的矩阵乘法?
  • 我猜他们想要一个“扫描”操作,即矩阵 1 的一行中的值乘以矩阵 2 的相应元素 ... @biostats_guy,你能显示所需的输出吗?
  • @ZachTurn 是的,我需要执行元素明智的乘法。我已编辑问题以读取元素而不是对象。谢谢
  • @BenBolker 我已在问题的输出中进行了编辑。谢谢。
  • @RonakShah 好的。下面列出的所有三种方法都对我有用

标签: r matrix


【解决方案1】:

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

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)

【讨论】:

  • 也许 OP 表示平方而不是平方根,因为 0.64 = 0.8^2,而 0.89 = sqrt(0.8) 在第 3 行第 1 列。
  • @imo 谢谢。是的,我的错。我的意思是平方和输入平方根。
【解决方案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

【讨论】:

  • 谢谢。非常感谢。
【解决方案3】:

这是我的解决方案,
为了从简单的逐元素乘法中受益,我们创建了一个名为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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 2013-06-18
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多