2016-08-03 17 views
0

我想知道從X-Y數據列中爲給定X值提取Y值的最可靠方法。從TCL中的X-Y表中挑選值的可靠方法

我目前正在執行與下面的代碼此操作,但非常不可靠/古怪,因爲它使翻倒,誤差不能讀或不變量var_01

請指點。基於列以Z

for {set i 0} {$i < [llength $Col_z]} {incr i} { 
    set Xdata [lindex $Col_x $i] 
    set Ydata [lindex $Col_y $i] 
    lappend var $Ydata 

    if { $Xdata >= 0.9 && $Xdata <= 1.1 } { 
    set a [lindex $var $i] 

    lappend var_01 $a 
    } else {lappend var_01 0 
      #set var_01 0} 
} 

回答

0

這是非常很難制定出你想要做的事情,但也許這有助於簡化代碼:

foreach z $Col_z x $Col_x y $Col_y { 
    if {$z eq {}} { 
     break 
    } 

    if {$x >= 0.9 && $x <= 1.1} { 
     lappend var_01 $y 
    } else { 
     lappend var_01 0 
    } 
} 

編輯根據評論:這是更好?

set var_01 {} 
foreach z $Col_z x $Col_x y $Col_y { 
    if {$z eq {}} { 
     break 
    } 

    if {$x >= 0.9 && $x <= 1.1} { 
     lappend var_01 $y 
    } 
} 

需要注意的是,如果沒有的x值的範圍內var_01可能是空的。

文檔: && (operator)<= (operator)>= (operator)breakeq (operator)foreachiflappendset

+0

嗨,彼得,謝謝。這部分工作,因爲它拿起正確的數據集。但是在所需數據之前和之後追加零。最後一步是取0.9和1.1之間的數據和平均值。我使用Join&llenght來平均,但所有的零都沒有得到正確的平均值。 – Anju

+0

@Anju:更新了答案。 –

+0

感謝彼得,我在發送消息之前曾試過,但仍然有前導零,但是尾隨零被刪除。現在只需要設法防止空變量 – Anju

0

一個非常方便的方式來表示在TCL的表

迭代是通過簡單的陣列。這裏有一個例子:


array set xy {} 

foreach i {1 2 3} { 
    foreach j {10 20 30} { 
     set xy($i,$j) [expr $i + $j] 
    } 
} 

現在xy是一個數組,其鍵看起來像表的索引。在這裏:

% array names xy 
3,10 2,20 1,30 3,20 2,30 3,30 1,10 2,10 1,20 

或者更明確:


% foreach k [array names xy] {puts $k} 
3,10 
2,20 
1,30 
3,20 
2,30 
3,30 
1,10 
2,10 
1,20 

下面是如何訪問它們:

% puts $xy(3,10) 
13 

3,10括號內是一個字符串!該數組返回與上面的循環中關聯的字符串關聯的值。 (因此逗號後面不能有空格)。

這很容易,如果索引變量提供給訪問值:

% set x 3 
3 
% set y 10 
10 
% puts $x,$y 
3,10 

最後的命令等同於明確的引號:

% puts "$x,$y" 
3,10 

這裏是我們如何可以訪問陣列在該密鑰處的元素:

% puts $xy($x,$y) 
13 

並且如果密鑰不存在:

% puts $xy(4,10) 
can't read "xy(4,10)": no such element in array 

讓我們打印數組的鍵和值的結論:


% foreach k [array names xy] {puts "$k: $xy($k)"} 
3,10: 13 
2,20: 22 
1,30: 31 
3,20: 23 
2,30: 32 
3,30: 33 
1,10: 11 
2,10: 12 
1,20: 21 

ADDED

現在,假設你有yz值,你如何找到了x

set y 20 
set z 23 

使用一切的特殊,強大的TCL屬性是一個字符串:

在這裏,我們找到的所有鍵和值匹配的鑰匙圖案*,20

set results [array get xy *,$y] 

讓我們來看看:

puts $results 

% 2,20 22 3,20 23 1,20 21 

我們得到了3對的列表,每個對包含關鍵字和值。

現在讓我們提取對應於輸入$z的鍵/值。我們將利用強大regexp Tcl命令,看到$results現在作爲一個字符串,而不是一個列表:

regexp "(\\d+),($y) ($z)" $results whole x1 y1 z1 

現在x1y1z1容納所有的信息,我們希望:

puts "$x1 $y1 $z1" 

% 3 20 23 
+0

嗨以色列,感謝您的例子。這裏Y是一個已知的值,如果我不知道Y值,並且給定的X值我想要找出Y值,該怎麼辦? – Anju

+0

@Anju,你好,我加了你問的一個例子。解決方案非常酷,並且tcl-ish! –