【问题标题】:Searching through a matrix in a specific pattern以特定模式搜索矩阵
【发布时间】:2014-11-08 09:57:31
【问题描述】:

我尝试在 R 中获取一些值。我不是一个有经验的编程人员。

我有一个以特定方式搜索矩阵的功能。这是矩阵:

k2=c(3,6,4,NA,NA,NA,NA)
k3=c(2,7,5,NA,NA,NA,NA)
k4=c(7,9,5,2,1,8,12)

df2=data.frame(k2,k3,k4)
m2=as.matrix(df2)
m2

     k2 k3 k4
[1,]  3  2  7
[2,]  6  7  9
[3,]  4  5  5
[4,]  NA NA  2
[5,]  NA NA  1
[6,]  NA NA  8
[7,]  NA NA 12

主要思想是在 k4 行中找一个值。如果该行的值不同, 该函数应检查同一行中的值,然后转到这些行 找到价值。

因此,如果 [1,k4] 中的值小于 val,则应将同一行 ([1,k3]) 中的第二列值作为行号,并检查第三列中的值该行中的列 [行的值,3]。如果值更大,它应该做和以前一样的事情,但使用 [1,k2]。如果该值再次不是所需的值,则应再次检查并为下一行重复相同的过程,直到获得匹配。

例子:

因此,如果我需要 val=5 那么它应该检查它是否与 [1,k4] 相同的值是 7 而不是,然后它应该去第三低检查 [3,k4] 和你可以看到是一样的,也就是说要打印5。如果我需要我需要的值是12,那么逻辑是否应该是这样的:val和7不一样,所以转到第三行,检查9,哦,它的值不一样,我会去第7行,在那里,它的值相同,然后我会打印......

到目前为止我的代码/我的进度

我知道我必须在每列时间搜索第三个,也就是说,从第一个开始

for (i in df2[1,3])

然后检查该列中的每个值是否不等于val:

if (!i == val)

对我来说,棘手的部分来了。我知道我必须检查它是小还是大,这意味着它应该是这样的

  if (!i == val) 
   #then check if its less, if yes, go that row
   #if it greater then go then go that row
   # go to that row and check the same thing there

我不知道该怎么做,所以它会为每一行重复自己,直到找到 val 中的值。我知道我可以将较小值的行指定为 n-2,将较大值的行指定为 n-1,但我在这里努力使其工作。正如我所说,我在编程方面的经验很少。

非常感谢!

我真的需要这方面的帮助。

【问题讨论】:

  • 我不能效仿你的榜样。使用val = 5 进入第一行,然后进入第三行,成功!第三行的值为 5。然后使用 val = 12 转到第一行,然后转到第三行并看到值 9。为什么不像第一次那样看到 5?
  • 另外,在for 循环的开头,您有for (i in df2[1, 3])。但是df2[1, 3] 是一个值,它是 7。所以你的 for 循环只需要一个值,i = 7。它是否正确?如果没有,您将尝试寻找的所有价值观是什么?
  • @Gregor 所以如果 val=12 1. 转到第一行并检查该行中最右边的值 2. 该值是 7 并且不一样,然后检查我应该在哪一行go 3.检查我应该去哪一行,如果我必须检查值是大于还是小于7 4.12大于7,所以我去第二行5.检查9,不是同12,再次检查是大还是小 6. 大于9,那么我应该去第7行 7. 值和12 一样 你看不到它,因为它像一个“捷径” 8. 打印具有值的整行

标签: r function matrix


【解决方案1】:

我将重新陈述您的问题,以便我们可以确定我们在一起。

我们有一个值要查找,还有一个矩阵要查看。矩阵就像一张地图:它给出了方向。我们从第一行开始,与k4 列进行比较。

  • 如果值等于这一行的k4 列,我们就完成了,成功!
  • 如果该值小于该行的k4 列,则转到k2 列指示的行号。
  • 如果该值大于k4 列,则转到k3 列指示的行号。
  • 继续直到找到匹配项。

正如您所说,它必须“对每一行重复自己,直到找到值”。由于我们不知道重复多少次,我们必须使用while 循环,而不是for 循环。 while 循环将继续尝试直到完成。 (这很危险,因为如果它找不到答案,它会一直尝试下去!所以如果它尝试的时间过长,我们可能会设置一个停止条件。)

k2=c(3,6,4,NA,NA,NA,NA)
k3=c(2,7,5,NA,NA,NA,NA)
k4=c(7,9,5,2,1,8,12)

m2 = cbind(k2, k3, k4)

my_search = function(value, matrix) {
    current.row = 1
    try.counter = 1
    while(value != matrix[current.row, 3]) {
        if (value < matrix[current.row, 3]) {
            current.row = matrix[current.row, 1]
        }
        if (value > matrix[current.row, 3]) {
            current.row = matrix[current.row, 2]
        }

        # This is the condition to stop if we can't find an answer
        # To keep the algorithm from getting caught in a circle.
        if (try.counter > 1e6) stop("Couldn't find an answer :(")
        try.counter = try.counter + 1
    }
    cat(paste("The successful row number is", current.row, "\n"))
    cat("It's values are:\n")
    print(matrix[current.row, ])
}

用法示例:

> my_search(12, m2)
k2 k3 k4 
NA NA 12 
> my_search(5, m2)
k2 k3 k4 
 4  5  5 

如果您希望能够分配函数的输出,则应在函数中添加另一行来指定要返回的内容,例如return(matrix[current.row, ]).

【讨论】:

猜你喜欢
  • 2019-01-13
  • 2015-05-12
  • 2018-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-05
相关资源
最近更新 更多