【问题标题】:How do I iterate over specific rows of a matrix?如何迭代矩阵的特定行?
【发布时间】:2018-02-20 18:43:05
【问题描述】:

我再次问这个问题是因为上次我根本不清楚。我有这些数据:

matrix.test = matrix(c(2, 4, 3, 1, 5, 7), nrow=3, ncol=2)
a <- c(1,5)

我想仅对第一行和第三行运行以下公式。所以第一行是:sqrt(sum(matrix.test[1,]-a)^2),第三行是sqrt(sum(matrix.test[3,]-a)^2)。第一个方程的结果是 3,第二个方程的结果是 4。

但是如果我有一个更大的矩阵,我怎么能告诉 R 在特定行上运行方程,而不是一遍又一遍地输入相同的方程到控制台?我不明白如何迭代矩阵的特定行。输出是什么并不重要。它可以是一个矩阵,例如

      [,1] 
[1,]    3    
[2,]    4  

或者只是一个向量,例如[1] 3 4

【问题讨论】:

  • 你在寻找:apply(matrix.test[c(1,3), ], 1, function(x) sqrt(sum(x - a)^2)),这里用你想要应用的行替换c(1,3)
  • 为什么要平方和平方根?您的目标是消除负面影响吗?
  • abs(rowSums(sweep(matrix.test[c(1,3),],2,a)))
  • abs(colSums(t(matrix.test[c(1,3),])-a))
  • 那么它是你知道的特定行号向量吗?还是有一个特定的规则可以知道要根据哪个计算?

标签: r loops matrix row


【解决方案1】:

更新一个更好的答案:

假设您有一个带有行号的向量。 基本思想是您可以使用该向量来指示行,例如 matrix.test[c(1,3),]。 我认为你想要这样的东西:

matrix.test.new <- matrix(c(matrix.test[rows,1] - a[1],
                          matrix.test[rows,2] - a[2]),
                          nrow = length(rows), ncol = 2)
sqrt((rowSums(matrix.test.new))^2)

当然,您可以通过其他方式生成 rows,例如测试是否为奇数等。

但是,您尝试执行的操作存在一些问题。首先,您在不检查符号的情况下取平方根。如果你打算为未知的输入写作,你总是会知道你有积极的结果,还是你准备好接受 NaN 作为答案?

其次,矩阵上的sum() 函数可能没有按照您的想法执行。这就是我们使用的rowSums(),因为它显式地作用于行而不是整个矩阵。

但是,我的示例向您展示了在 R 中您不会像在其他语言中那样迭代,但是该示例使用不会生成 NaN 并且可以按行工作的函数。

棘手的部分是要意识到,如果您在向量(矩阵的一行)上进行减法运算,而不是在整个矩阵上进行减法运算,则会发生变化。在这种情况下,因为你知道你正好有两列我可以处理。如果你有一个更复杂的案例,你必须想出一种动态的方法。

【讨论】:

  • 这甚至没有给出想要的输出
  • 感谢您的回复。所以我不会平方根负值,因为它们都是平方的。其次,我相信 sum() 做我想做的事。在我的示例中,我基本上是在告诉 R 给我 (2-1)^2(1-5)^2 的总和,这就是我想要的。我只是在我的帖子中搞砸了方程式。
  • 所以在矩阵中 sum() 不是矢量化的,它实际上为您提供了整个矩阵中所有值的 sum()。这就是创建 sumRows() 等的原因。它的工作方式与 sum() 将 oclumn 的总数设为五的数据帧不同。
  • 此外,如果您的问题有错误,请编辑问题,包括方程式和您期望得到的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-20
  • 1970-01-01
  • 2019-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多