TCL中是否有任何类型的矩阵过滤器?

时间:2017-03-28 04:17:13

标签: sorting matrix filter tcl

给出以下矩阵:

1 2 3 4
1 2 3 0
1 2 0 0
1 0 0 0
1 0 0 5

返回包含搜索信息的行。

例如:

matrixname filter {{1} {} {3} {}}

回报将是:

1 2 3 4
1 2 3 0

matrixname filter {{1} {} {} {4}}

回报将是:

1 2 3 4

这样的事情已经存在吗?我在想几乎是SQL-esk类型的函数WHERE COL = VALUEORDER BY类型的东西。

我环顾四周,但我找不到任何东西。

--------------------------------- EDIT

我已经提出以下内容来搜索给定的字段。

::struct::list dbJoin -inner\
                      -keys FoundKeyList\
                      1 [::struct::list dbJoin -inner\
                                               1 [MatrixName search -nocase column 2 $ITEM1]\
                                               1 [MatrixName search -nocase column 1 $ITEM2]]\
                      1 [MatrixName search -nocase column 0 $ITEM3];

这将提供与搜索条件匹配的行号列表。 然后,您只需使用MatrixName get row rowmatrixName get rect column_tl row_tl column_br row_br即可获得结果。

有人对此有任何反馈吗?

2 个答案:

答案 0 :(得分:1)

有两种选择。

在tcllib中,有struct::matrix个包。它有一个搜索命令。但是,该命令会搜索单个单元格上的模式(可以约束到特定列),您需要编写一个过程来执行实现所描述的连接匹配所需的多次搜索。

另一个选项是TclRAL。这将为您提供关系值(也称为表),您可以执行restrict命令以获取与任意表达式匹配的子集,例如

set m [ral::relation table {C1 int C2 int C3 int C4 int}\
    {1 2 3 4} {1 2 3 0} {1 2 0 0} {1 0 0 0} {1 0 0 5}]
set filt [ral::relation restrictwith $m {$C1 == 1 && $C3 == 3}]

然而,这两个选项都有点重量级"如果您需要对表格数据执行的操作多于您在问题中指出的操作,则可能是合理的。如果您的问题范围与您的问题所表明的一样小,那么就像其他评论者建议的那样简单地删除程序可能是您最好的选择。

答案 1 :(得分:0)

package require struct::matrix 

struct::matrix xdata
xdata add columns 4
xdata add rows    5

xdata set rect 0 0 {
{1 2 3 4}
{1 2 3 0}
{1 2 0 0}
{1 0 0 0}
{1 0 0 5}
}

foreach {c r} [join [xdata search -regexp all {1*3}]] { puts [xdata get row $r] }
# 1 2 3 4
# 1 2 3 0

foreach {c r} [join [xdata search -regexp all {1*4}]] { puts [xdata get row $r] }
# 1 2 3 4

xdata destroy

这应该会达到预期的结果。