测试 TCL 中是不是存在矩阵对象

Posted

技术标签:

【中文标题】测试 TCL 中是不是存在矩阵对象【英文标题】:Test if matrix object exists in TCL测试 TCL 中是否存在矩阵对象 【发布时间】:2019-04-16 15:05:42 【问题描述】:

我想测试一个tcl-matrix 对象是否存在。我该怎么做?

以下代码不起作用。

package require struct::matrix

# Test (now we expect 0)
info exists m
# Create the object
struct::matrix m

# Test again, now I expect 1, however it returns 0!!!
info exists m

【问题讨论】:

【参考方案1】:

使用info commands 测试矩阵对象是否存在。 info exists 测试变量的(不)存在。

% package req struct::matrix
2.0.3
% info commands m
% struct::matrix m
::m
% info commands m
m

背景

一个矩阵对象被实现为一个 Tcl 命令(准确地说是一个别名命令)加上每个矩阵的 Tcl 命名空间(作为存储)。

或者,但这在很大程度上取决于当前的实现,您可以测试是否存在所谓的命名空间:

% package req struct::matrix
2.0.3
% namespace exists m
0
% struct::matrix m
::m
% namespace exists m
1

例如,当矩阵对象被重新实现为 TclOO 对象时,该命令的测试也将继续工作。

【讨论】:

是否有合理的方法来询问命令是struct::matrix 还是我们在这里说的是鸭子打字?【参考方案2】:

略过the struct::matrix source code:

% package req struct::matrix
2.0.3
% set m [struct::matrix]
::matrix1
% expr $m in [interp aliases]
1
% string first MatrixProc [interp alias  $m]
18
% proc is_matrix name 
    expr 
         $name in [interp aliases] &&
         [string first MatrixProc [interp alias  $name]] != -1
    

% is_matrix $m
1

如果您使用struct::matrix m 形式,那么请使用完全限定的::m 而不是$m

% struct::matrix m
::m
% is_matrix m
0
% is_matrix ::m
1

【讨论】:

显然,这需要了解 struct::matrix 的当前实现。如果它在将来的某个 tcllib 版本中发生更改,则此答案无效。

以上是关于测试 TCL 中是不是存在矩阵对象的主要内容,如果未能解决你的问题,请参考以下文章

是否存在稀疏矩阵/对象的`data.table`表示?

R对象不是矩阵

犰狳库是不是会减慢矩阵运算的执行速度?

使用R中的稀疏矩阵从矢量中提取元素,而不转换为密集矩阵

即使更改模型视图矩阵,使用顶点缓冲区对象是不是有意义?

SWIG C++ TCL:处理内存中预先存在的对象