以特定模式搜索矩阵

时间:2014-11-08 09:57:31

标签: r function matrix

我试图在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行,那就是,它相同的val,我会打印然后......

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

我知道我必须每列时间搜索第三个,所以这意味着从第一个

开始
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,但我在这里努力使其工作。正如我所说,我对编程的经验很少。

非常感谢!

我真的需要帮助。

1 个答案:

答案 0 :(得分:0)

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

我们有一个要查找的值,以及一个要查看的矩阵。矩阵就像一张地图:它给出了方向。我们从第一行开始,并与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, ])