【问题标题】:How to perform complex looping operation on matrix如何对矩阵进行复杂的循环操作
【发布时间】:2015-07-01 20:16:41
【问题描述】:

我有一个像

这样的样本矩阵
 5 4 3  
 2 6 8   
 1 9 7   

我想要像

这样的输出
max(5*6,5*8,5*9,5*7)  // i!=j condition  
max(4*2,4*8,4*1,4*7)  
max(3*2,3*6,3*1,3*9)  

等等……

这个计算后得到的最大值应该是矩阵形式。我需要概括它,因此我需要一个通用代码。

【问题讨论】:

  • 您应该可以自己使用for 循环来解决这个问题。在你的问题中表现出一些努力。
  • 这段代码给出了第一行获得的最大值,如果“i 不等于 j”的条件在所有行上保持不变,我希望对所有行进行相同的操作

标签: r loops matrix determinants


【解决方案1】:

这可以完成工作,但这是一个非常缺乏想象力的解决方案,因为它只是循环执行请求的计算的行和列,而不是执行任何矢量化操作。

sapply(1:ncol(m), function(j) sapply(1:nrow(m), function(i) max(m[i,j]*m[-i,-j])))
#      [,1] [,2] [,3]
# [1,]   45   32   27
# [2,]   18   42   72
# [3,]    8   72   42

数据:

(m <- matrix(c(5, 2, 1, 4, 6, 9, 3, 8, 7), nrow=3))
#      [,1] [,2] [,3]
# [1,]    5    4    3
# [2,]    2    6    8
# [3,]    1    9    7

【讨论】:

  • 对于非负数,分解乘法应该更快:m[i,j]*max(m[-i,-j]) 不过不知道这是否是 OP 的应用范围。
  • @Frank 我刚刚将 max 移到了乘法之外,以解决 SvenHohenstein 的评论,即我之前的解决方案(这正是您所描述的)仅适用于非负矩阵。恐怕我们不能两全其美。再说一次,我想你所描述的效率影响很小。
  • 哦,好的。我没有注意到您对答案的第一次迭代。是的,随着规模的扩大,我猜max 应该占主导地位。
  • 另一个带有outer outer(1:nrow(m1), 1:ncol(m1), FUN= Vectorize(function(i,j) max(m1[i,j]*m1[-i,-j])))的版本
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多