当前位置: 首页 > 知识库问答 >
问题:

筛选行号之间差异最大的矩阵行

胡意致
2023-03-14

有一个矩阵a,比如:

 1   21    3   49   59
21   33   59   67   65
 3    5    7    8   11
21   76    5    4    9

我只想得到每行没有3个或更多数字的行,它们之间都有最大差异

此函数应仅返回第1行。

共有3个答案

公羊安怡
2023-03-14

对提交的两份答复的分析:

输入:

pacman::p_load(microbenchmark)

vec <- c(1, 21, 3, 49, 59, 21, 33, 59,
     67, 65, 3, 5, 7, 8, 11, 21, 76, 5, 4, 9)

A <- matrix(vec, nrow = 4, byrow = TRUE)

returnRows <- function(x) {
  count <- 0
  for (i in 1:nrow(x)) {
    if (length(which(diff(combn(x[i,],2)) < 10)) < 3) {
      count <- c(count,i)
    }
  }
  return(x[count[-1],])
}

# dvarelas' answer
microbenchmark(returnRows(A))

# Sotos' answer
microbenchmark(A[rowSums(t(apply(A, 1, function(i)combn(i, 2, diff))) < 10) < 3,])

输出:

> microbenchmark(returnRows(A))
Unit: microseconds
          expr     min      lq     mean   median       uq    max neval
 returnRows(A) 137.113 141.124 152.6586 143.8595 154.7995 301.94   100

> microbenchmark(A[rowSums(t(apply(A, 1, function(i)combn(i, 2, diff))) < 10) < 3,])
Unit: microseconds
                                                                      expr     min      lq     mean   median     uq      max neval
 A[rowSums(t(apply(A, 1, function(i) combn(i, 2, diff))) < 10) <      3, ] 374.507 431.759 645.9935 544.4395 742.45 5324.047   100

结论:dvarelas的答案比Sotos的快得多

廖绍辉
2023-03-14

您可以找到所有值组合的diff,并使用rowsumes进行过滤,即。

A[rowSums(t(apply(A, 1, function(i)combn(i, 2, diff))) < 10) < 3,]
#[1]  1 21  3 49 59
满俊楠
2023-03-14

这段代码就可以了。还有一个小例子:

vec <- c(1, 21, 3, 49, 59, 21, 33, 59,
         67, 65, 3, 5, 7, 8, 11, 21, 76, 5, 4, 9)

A <- matrix(vec, nrow = 4, byrow = TRUE)

returnRows <- function(x) {
  count <- 0
  for (i in 1:nrow(x)) {
    if (length(which(diff(combn(x[i,],2)) < 10)) < 3) {
      count <- c(count,i)
    }
  }
  return(x[count[-1],])
}

## example

returnRows(A)
 类似资料:
  • 问题内容: 给定两个矩阵,我想计算所有行之间的成对差异。每个矩阵都有1000行和100列,因此它们相当大。我尝试过使用for循环和纯广播,但是for循环的运行速度似乎更快。难道我做错了什么?这是代码: 广播方法大约需要1秒钟的时间,对于大型矩阵来说甚至更长。任何想法如何纯粹使用numpy加快速度吗? 问题答案: 这是另一种执行方式: (ab)^ 2 = a ^ 2 + b ^ 2-2ab 与前两个

  • 在一本书(算法导论,但我不记得是哪一章)中,我学到了求解两元素间最大差值问题: 两个元素之间的最大差,使得较大的元素出现在较小的数之后。 查找数组(至少包含一个数字)中和最大的相邻子数组。 例如,给定数组[-2,1,-3,4,-1,2,1,-5,4],相邻子数组[4,-1,2,1]的最大和=6。 为了解决的两元素间最大差异问题,可以将其转化为数组的最大子数组问题: 我在想为什么。

  • 我想查询日期范围内的elasticsearch文档。我现在有两个选择,都很适合我。我已经测试了他们两个。1.范围查询2。距离滤波器 因为我现在有一个小数据集,所以无法测试它们的性能。这两者有什么区别?哪一种方法可以更快地检索文档和响应?

  • 问题内容: 这是我的表结构: 我需要它仅返回这些行 意思是我只想要每个文件具有最新版本的功能。 我不想要下面的结果,即不是最新版本的唯一函数ID 我看过如何通过SQL中的另一列来选择具有MAX(列值),DISTINCT的行?,但会返回最新的唯一函数ID。 该查询必须与sqlite3兼容。 问题答案: 一种有效的方法通常是使用: 此查询可以利用上的索引。 这将查询重新表述为:“从表中获取其中相应文件

  • 下面是二进制矩阵最大面积的代码。它有一个函数MAH()来返回直方图的最大面积。方法是将二进制矩阵(2d)分解为一维。然后将MAH()应用于每个一维数组并找到最大面积。 类解决方案{ 问题链接:二进制矩阵的最大面积 MAH()函数是正确的。仅maximalRectangle(char[][]矩阵)函数无法给出结果。有人能解释一下吗?? 这是另一个人发布的maximalRectangle(char[]

  • 我实现了c程序,可以找到矩阵的元素:行的最大元素,同时列的最小元素,或行的-min元素,同时列的最大元素。例如,我们有数据。包含以下内容的txt文件: 4 7 8 9 10 6 5 4 11 5 0 1 12 4 2 7 13- 其中4是n-矩阵大小(4x4),7和10是这些数字。 下面是代码: 问题:我想知道我的代码是不是“脏”代码?因为我总是渴望让一切变得如此困难,只要有可能让它变得容易。是否