2016-08-03 38 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! –