-3

次のようなマトリックスがあります

`> y
       1         2         3
1  0.8802216 1.2277843 0.6875047
2  0.9381081 1.3189847 0.2046542
3  1.3245534 0.8221709 0.4630722
4  1.2006974 0.8890464 0.6710844
5  1.2344071 0.8354292 0.7259998
6  1.1670665 0.9214787 0.6826173
7  0.9670581 1.1070461 0.7742342
8  0.8867365 1.2160533 0.7024281
9  0.8235792 1.4424190 0.2030302
10 0.8821301 1.0541099 1.2279813
11 1.1958634 0.9708839 0.4297043
12 1.3542734 0.7747481 0.5119648
13 0.4385487 0.3588158 4.9167998
14 0.8530141 1.3578511 0.3698620
15 0.9651803 0.8426226 1.6132899
16 0.8854192 1.2272616 0.6715839
17 0.7779642 0.8132233 2.3386331
18 0.9936722 1.1629110 0.5083558
19 1.1235897 1.0018480 0.5764672
20 0.7887222 1.3101684 0.7373181
21 2.2276176 0.0000000 0.0000000`

手がかりが 1 つ見つかりましたが、これでマトリックス全体の位置がわかります」

n<-read.table(file.choose(),header=T)

y<-n[,c("1","2","3")]

my.number=1.12270420185886 .

z<-abs(y-my.number)==min(abs(y-my.number)) which(z) [1] 19 `

私は文字と列のない少なくとも5つの最も近い値を見つけたいと思っています.

4

1 に答える 1

2

何語かわかりません。Rですか?

手続き型言語では、すべての値をマップ (val, (pos)) = (val (row, col); example (0.880..-> (1, 1)) に保存し、値で並べ替えます。

次に、i<-pos (1 から map.size-5) を反復処理し、差分 (pos (i)、pos (i+5)) を取得し、最小値 (diff) を検索し、値とその位置を取得します。 .

Scalaでの解決策は次のとおりです。

val matrix = """1  0.8802216 1.2277843 0.6875047
2  0.9381081 1.3189847 0.2046542
3  1.3245534 0.8221709 0.4630722
4  1.2006974 0.8890464 0.6710844
5  1.2344071 0.8354292 0.7259998
6  1.1670665 0.9214787 0.6826173
7  0.9670581 1.1070461 0.7742342
8  0.8867365 1.2160533 0.7024281
9  0.8235792 1.4424190 0.2030302
10 0.8821301 1.0541099 1.2279813
11 1.1958634 0.9708839 0.4297043
12 1.3542734 0.7747481 0.5119648
13 0.4385487 0.3588158 4.9167998
14 0.8530141 1.3578511 0.3698620
15 0.9651803 0.8426226 1.6132899
16 0.8854192 1.2272616 0.6715839
17 0.7779642 0.8132233 2.3386331
18 0.9936722 1.1629110 0.5083558
19 1.1235897 1.0018480 0.5764672
20 0.7887222 1.3101684 0.7373181
21 2.2276176 0.0000000 0.0000000"""

// split block of text into lines
val lines=matrix.split ("\n")
// split lines into words
val rows = lines.map (l => l.split (" \\+"))
// remove the index from the beginning (1, 2, ... 21) and 
// transform values from Strings to double numbers
// triples is: Array(Array(0.8802216, 1.2277843, 0.6875047), Array(0.9381081, 1.3189847, 0.2046542),
val triples = rows.map (_.tail).map(triple=> triple.map (_.toDouble))
// generate an own index for the rows and columns 
// elems is: elems: Array[Array[(Double, (Int, Int))]] = Array(Array((0.8802216,(0,0)), (1.2277843,(0,1)), (0.6875047,(0,2))), Array((0.9381081,(1,0)), ...
val elems = triples.zipWithIndex.map {t=> t._1.zipWithIndex.map (vc=> (vc._1 -> (t._2, vc._2)))}
// sorted = Array((0.0,(20,1)), (0.0,(20,2)), (0.2030302,(8,2)), (0.2046542,(1,2)), 
val sorted = elems.sortBy (e => e._1)
// delta5 = List(0.3588158, 0.369862, 0.2266741, 0.2338945, 0.10425639999999997, 0.1384938,
val delta5 = sorted.sliding (5, 1).map (q => q(4)._1-q(0)._1).toList
val minindex = delta5.indexOf (delta5.min) // minindex: Int = 29, delta5.min = 0.008824799999999966

// we found the smallest intervall of 5 values beginning at 29: 
(29 to 29 +5).map (sorted (_)) 
res568: scala.collection.immutable.IndexedSeq[(Double, (Int, Int))] = 
    Vector( (0.8802216,(0,0)), 
        (0.8821301,(9,0)), 
        (0.8854192,(15,0)), 
        (0.8867365,(7,0)), 
        (0.8890464,(3,1)), 
        (0.9214787,(5,1)))

Scala は 0 から 20 および 0 から 2 までカウントするため、インデックスはそれぞれ 1 から 3 および 1 から 21 まで実行されるため、各位置に (1,1) を追加する必要があります => (1,1)、(10 、1) など。

于 2012-04-26T14:04:39.103 に答える