- 向量
veczero
: 零向量,{0 0 0}
vecadd v1 v2 [v3 ... vn]
: 所有向量的向量和 (C++)vecmul v1 v2
: 两个向量的分量逐项相乘后得到的向量vecsub v1 v2
: 第一个向量减去第二个向量的差向量 (C++)vecsum v
: 向量v
中所有元素的和 (C++)vecmean v
: 向量v
中所有元素的平均值 (C++)vecstddev v
: 向量v
中所有元素的标准偏差 (C++)vecscale c v
或vecscale v c
: 向量v
中的每个元素与标量c
相乘后得到的向量 (C++)vecdot v1 v2
: 两个向量的标量点积veccross v1 v2
: 两个向量的向量叉积veclength v
: 向量v
的标量长度($\Vert v \Vert$)veclength2 v
: 向量标量长度的平方($\Vert v \Vert^2$)vecnorm v
: 沿向量v
方向的单位向量vecdist v1 v2
: 两个向量之间的距离($\Vert v_2-v_1\Vert$)vecinvert v
: 向量v
的逆向量($-v$)
- 矩阵
transidentity
: 单位矩阵transtranspose m
: 给定矩阵的转置transmult m1 m2 [m3 ... mn]
: 给定矩阵的乘积 (C++)transaxis <x|y|z> amount [deg|rad|pi]
: 绕指定轴旋转给定角度所需的变换矩阵.transvec v
: 使x轴沿向量v方向所需的变换矩阵.transvecinv v
: 使向量v沿x轴方向所需的变换矩阵.transoffset v
: 沿给定偏移量进行平移所需的变换矩阵 (C++)transabout v amount [deg|rad|pi]
: 绕通过原点并沿给定向量方向的轴逆时针旋转给定角度所需的变换矩阵.trans [center {x y z}] [origin {x y z}] [offset {x y z}] [axis x amount [rad|deg|pi]] [axis y amount [rad|deg|pi]] [axis z amount [rad|deg|pi]] [x amount [rad|deg|pi]] [y amount [rad|deg|pi]] [z amount [rad|deg|pi]] [axis {x y z} amount [rad|deg|pi]] [bond {x1 y1 z1} {x2 y2 z2} amount [rad|deg|pi]] [angle {x1 y1 z1} {x2 y2 z2} {x3 y3 z3} amount [rad|deg|pi]]
: 通用命令
- 向量与矩阵相乘
- 其他函数和值
- 2020-03-23 20:57:46
- 原文来自VMD 1.9.3手册 Vectors and Matrices
Tcl对数学表达式的处理不够好, 计算表达式的速度很慢, 并且没有提供处理向量或矩阵的便利工具. 由于进行结构分析时经常涉及向量或矩阵, 因此我们添加了一些操作它们的函数.
VMD中的向量是一些数字的列表. 所有的向量函数都可以处理任意长度的向量, 但veccross
除外, 它只能用于含3个数字的向量. VMD中的矩阵是一个4x4的数字集合, 存储形式为4个向量的列表, 每个向量包含4个数字, 存储时行优先.
以下是所有命令的说明和示例. 用于测试向量实现的脚本$env(VMDDIR)/scripts/vmd/test-vectors.tcl
中包含了更多的示例, 但相关文档并不多.
由于Tcl的数学运算很慢, 其中的一些命令已经用C++重新实现了(命令的原始定义见VMD脚本的发行版, 但稍后在VMD内部进行了重新定义). 有时, 加速比可以达到40或更多. 这样的命令用(C++)标识出来.
向量
veczero
: 零向量, {0 0 0}
vmd>veczero
0 0 0
vecadd v1 v2 [v3 ... vn]
: 所有向量的向量和 (C++)
vmd > vecadd {1 2 3} {4 5 6} {7 8 9} {-11 -11 -11}
1 4 7
vmd > vecadd {0.1 0.2 0.4 0.8} {1 1 2 3} {3 1 4 1}
4.1 2.2 6.4 4.8
vmd > vecadd 4 5
9
vecmul v1 v2
: 两个向量的分量逐项相乘后得到的向量
vmd > vecmul {1 2 3} {4 5 6}
4 10 18
vmd > vecmul {0.1 0.2 0.4 0.8} {1 1 2 3}
0.1 0.2 0.8 2.4
vecsub v1 v2
: 第一个向量减去第二个向量的差向量 (C++)
vmd > vecsub 6 3.2
2.8
vmd > vecsub {10 9.8 7} {0.1 0 -0.1}
9.9 9.8 7.1
vmd > vecsub {1 2 3 4 5} {6 7 8 9 10}
-5 -5 -5 -5 -5
vecsum v
: 向量v
中所有元素的和 (C++)
vmd > vecsum { 1 2 3 }
6.0
vecmean v
: 向量v
中所有元素的平均值 (C++)
vmd > vecmean { 1 2 3 }
2.0
vecstddev v
: 向量v
中所有元素的标准偏差 (C++)
vmd > vecstddev { 1 2 3 4 5 6 7 8 9 10 }
2.87228131294
vecscale c v
或 vecscale v c
: 向量v
中的每个元素与标量c
相乘后得到的向量 (C++)
vmd > vecscale .2 {1 2 3}
0.2 0.4 0.6
vmd > vecscale {-5 4 -3 2} -2
10 -8 6 -4
vmd > vecscale -2 3
-6
vecdot v1 v2
: 两个向量的标量点积
vmd > vecdot {1 -2 3} {4 5 6}
12
vmd > vecdot {3 4} {3 4}
25
vmd > vecdot {1 2 3 4 5} {5 4 3 2 1}
35
vmd > vecdot 3 -2
-6
veccross v1 v2
: 两个向量的向量叉积
vmd > veccross {1 0 0} {0 1 0}
0 0 1
vmd > veccross {2 2 2} {-1 0 0}
0 -2 2
veclength v
: 向量v
的标量长度($\Vert v \Vert$)
vmd> veclength 5
5.0
vmd > veclength {5 12}
13.0
vmd > veclength {3 4 12}
13.0
vmd > veclength {1 -2 3 -4}
5.47723
veclength2 v
: 向量标量长度的平方($\Vert v \Vert^2$)
vmd > veclength2 5
25
vmd > veclength2 {5 12}
169
vmd > veclength2 {3 4 12}
169
vmd > veclength2 {1 -2 3 -4}
30
vecnorm v
: 沿向量v
方向的单位向量
vmd > vecnorm -10
-1.0
vmd > vecnorm {1 1 }
0.707109 0.707109
vmd > vecnorm {2 -3 1}
0.534522 -0.801783 0.267261
vmd > vecnorm {2 2 -2 2 -2 -2}
0.408248 0.408248 -0.408248 0.408248 -0.408248 -0.408248
vecdist v1 v2
: 两个向量之间的距离($\Vert v_2-v_1\Vert$)
vmd > vecdist -1.5 5.5
7.0
vmd > vecdist {0 0 0} {3 4 0}
5.0
vmd > vecdist {0 1 2 3 4 5 6} {-6 -5 -4 -3 -2 -1 0}
15.8745
vecinvert v
: 向量v
的逆向量($-v$)
vmd > vecinvert -11.1
11.1
vmd > vecinvert {3 -4 5}
-3 4 -5
vmd > vecinvert {0 -1 2 -3}
0 1 -2 3
矩阵
由于以文本形式显示矩阵时相当大, 因此在示例中会使用以下定义.
transidentity
: 单位矩阵
vmd > transidentity
{1.0 0.0 0.0 0.0} {0.0 1.0 0.0 0.0} {0.0 0.0 1.0 0.0} {0.0 0.0 0.0 1.0}
transtranspose m
: 给定矩阵的转置
vmd > transtranspose { {0 1 2 3 4} {5 6 7 8} {9 10 11 12} {13 14 15 16} }
{0 5 9 13} {1 6 10 14} {2 7 11 15} {3 8 12 16}
transmult m1 m2 [m3 ... mn]
: 给定矩阵的乘积 (C++)
vmd > set mat1 { {1 2 3 4} {-2 3 -4 5} {3 -4 5 -6} {4 5 -6 -7} }
vmd > set mat2 { {1 0 0 0} {0 0.7071 -0.7071 0} {0 0.7071 0.7071 0} {0 0 0 1} }
vmd > set mat3 { {0.866025 0 0 0} {0 1 0 0} {-0.5 0 0.866025 0} {0 0 0 1} }
vmd > transmult $mat1 [transidentity]
{1.0 2.0 3.0 4.0} {-2.0 3.0 -4.0 5.0} {3.0 -4.0 5.0 -6.0}
{4.0 5.0 -6.0 -7.0}
vmd > transmult $mat1 $mat2 $mat3
{0.512475 3.5355 0.612366 4.0} {0.7428 -0.7071 -4.28656 5.0}
{-0.58387 0.7071 5.5113 -6.0} {7.35315 -0.7071 -6.73603 -7.0}
transaxis <x|y|z> amount [deg|rad|pi]
: 绕指定轴旋转给定角度所需的变换矩阵.
默认情况下, 角度以度为单位, 但也可以使用rad(弧度)或pi(π).
vmd > transaxis x 90
{1.0 0.0 0.0 0.0} {0.0 -3.67321e-06 -1.0 0.0} {0.0 1.0 -3.67321e-06 0.0}
{0.0 0.0 0.0 1.0}
vmd > transaxis y 0.25 pi
{0.707107 0.0 0.707107 0.0} {0.0 1.0 0.0 0.0}
{-0.707107 0.0 0.707107 0.0} {0.0 0.0 0.0 1.0}
vmd > transaxis z 3.1415927 rad
{-1.0 -2.65359e-06 0.0 0.0} {2.65359e-06 -1.0 0.0 0.0} {0.0 0.0 1.0 0.0}
{0.0 0.0 0.0 1.0}
transvec v
: 使x轴沿向量v方向所需的变换矩阵.
构造方式为先沿y轴旋转, 再沿z轴旋转. 这个矩阵并不唯一, 因为最终仍可以沿向量进行任意旋转.
vmd > transvec {0 1 0}
{-3.67321e-06 -1.0 0.0 0.0} {1.0 -3.67321e-06 0.0 0.0} {0.0 0.0 1.0 0.0}
{0.0 0.0 0.0 1.0}
vmd > vectrans [transvec {0 0 2}] {1 0 0}
0.0 0.0 1.0
transvecinv v
: 使向量v沿x轴方向所需的变换矩阵.
结果为transvec
的逆矩阵, 构造方式为先沿z轴旋转, 再沿y轴旋转.
vmd > transvecinv {0 -1 0}
{-3.67321e-06 -1.0 0.0 0.0} {1.0 -3.67321e-06 0.0 0.0} {0.0 0.0 1.0 0.0}
{0.0 0.0 0.0 1.0}
vmd > vectrans [transvecinv {-3 4 -12}] {-3 4 -12}
13.0 -1.8e-05 5.8e-05
vmd > transmult [transvec {6 -5 7}] [transvecinv {6 -5 7}]
{0.999999 2.29254e-07 -6.262e-09 0.0} {2.29254e-07 0.999999
-4.52228e-07 0.0} {-6.262e-09 -4.52228e-07 1.0 0.0} {0.0 0.0 0.0 1.0}
transoffset v
: 沿给定偏移量进行平移所需的变换矩阵 (C++)
vmd > transoffset {1 0 0}
{1.0 0.0 0.0 1} {0.0 1.0 0.0 0} {0.0 0.0 1.0 0} {0.0 0.0 0.0 1.0}
vmd > transoffset {-6 5 -4.3}
{1.0 0.0 0.0 -6} {0.0 1.0 0.0 5} {0.0 0.0 1.0 -4.3} {0.0 0.0 0.0 1.0}
transabout v amount [deg|rad|pi]
: 绕通过原点并沿给定向量方向的轴逆时针旋转给定角度所需的变换矩阵.
与transvec
一样, 旋转角度的单位可以是度, 弧度或π.
# 绕 x 轴 180 度
vmd > transabout {1 0 0} 180
{1.0 0.0 0.0 0.0} {0.0 -1.0 -2.65359e-06 0.0} {0.0 2.65359e-06
-1.0 0.0} {0.0 0.0 0.0 1.0}
# 绕 z 轴 90 度 (同"transaxis z 90")
vmd > transabout {0 0 1} 1.5709 rad
{0.999624 -0.027414 0.0 0.0} {0.027414 0.999624 0.0 0.0}
{0.0 0.0 1.0 0.0} {0.0 0.0 0.0 1.0}
vmd > transabout {1 1 1} 1 pi
{-0.333335 0.666665 0.666669 0.0} {0.666668 -0.333334 0.666666
0.0} {0.666666 0.66667 -0.333332 0.0} {0.0 0.0 0.0 1.0}
trans [center {x y z}] [origin {x y z}] [offset {x y z}] [axis x amount [rad|deg|pi]] [axis y amount [rad|deg|pi]] [axis z amount [rad|deg|pi]] [x amount [rad|deg|pi]] [y amount [rad|deg|pi]] [z amount [rad|deg|pi]] [axis {x y z} amount [rad|deg|pi]] [bond {x1 y1 z1} {x2 y2 z2} amount [rad|deg|pi]] [angle {x1 y1 z1} {x2 y2 z2} {x3 y3 z3} amount [rad|deg|pi]]
: 通用命令
此命令几乎可以进行其他命令支持的所有操作, 还支持其他一些操作. 它是用于生成变换矩阵的主要函数.
正确使用它需要了解其内部工作方式. 共有三个矩阵: 居中, 旋转和偏移. 居中矩阵确定旋转中心的位置. 默认为原点, 但也可以更改为任何点. 旋转矩阵定义了绕中心点的旋转, 偏移矩阵定义了旋转后的进行的最终平移.
例如, 要绕一个给定点旋转, 变换应该是: 1) 使用居中矩阵将该点变为原点, 2) 绕中心旋转, 3) 使用偏移矩阵将原点平移回最初位置.
trans
命令的不同选项可以不同的方式改变矩阵.
center {x y z}
: 设定居中矩阵, 将点{x y z}变为原点offset {x y z}
: 设定偏移矩阵, 将原点变为{x y z}origin {x y z}
: 居中矩阵和偏移矩阵同时设定为{x y z}axis x amount [rad|deg|pi]
: 为旋转矩阵增加绕x轴旋转给定角度的旋转axis y amount [rad|deg|pi]
: 为旋转矩阵增加绕y轴旋转给定角度的旋转axis z amount [rad|deg|pi]
: 为旋转矩阵增加绕z轴旋转给定角度的旋转axis {x y z} amount [rad|deg|pi]
: 为旋转矩阵增加绕指定向量旋转给定角度的旋转bond {x1 y1 z1} {x2 y2 z2} amount [rad|deg|pi]
: 将居中和偏移矩阵设定为第一个点, 然后定义绕键轴旋转给定角度的旋转angle {x1 y1 z1} {x2 y2 z2} {x3 y3 z3} amount [rad|deg|pi]
: 将居中和偏移矩阵设定为第二个点, 然后定义绕三个点所在平面法向旋转给定角度的旋转(平面法向为连接前两个点的向量和连接后两个点的向量的叉积).
向量与矩阵相乘
有两个命令用来对矩阵和向量进行相乘, vectrans
和coordtrans
. 它们假定向量为列形式, 并将矩阵乘以向量. 如果向量包含4个数字, 这两个命令完全相同. 如果向量只有3个元素, 会添加第4个元素; 对vectrans
会添加0, 对coordtrans
会添加1. 不同之处在于, 在变换过程中, 向量不受平移的影响, 但坐标会受到影响.
vectrans m v
: 将矩阵m与向量v(长度为4)相乘; 返回向量 (C++)
coordtrans m v
: 将矩阵m与坐标v(长度为3)相乘; 返回向量
示例:
vmd > vectrans [transaxis z 90] {1 0 0}
-3.67321e-06 1.0 0.0
vmd > vectrans [transvecinv {-3 4 -12}] {-3 4 -12}
13.0 -1.8e-05 5.8e-05
其他函数和值
向量包中还包含其他一些项. 第一个是变量M_PI
, 表示pi的值.
vmd > set M_PI
3.14159265358979323846
vmd > expr 90 * ($M_PI / 180)
1.5708
函数trans_from_rot
, trans_to_rot
, trans_from_offset
和trans_to_offset
用于从3x3旋转矩阵或偏移矢量获取或设置变换矩阵. 按照目前的设计, 这些函数假设矩阵没有缩放. trans_from_offset
与transoffset
完全相同, 包含二者只是出于完整性的考虑.
最后一个函数是find_rotation_value varname
, 它接受一个变量名称, 并从其开头提取说明描述旋转的项. 变量中的其余数据会保留下来, 然后返回以弧度为单位的旋转角度.
那些需要旋转的函数使用这个函数. 有效值为: 一个数字, 后面跟着rad
, radian
或radians
表示以弧度为单位的值, pi
表示以pi为单位, deg
, degree
或degrees
表示以度为单位. 如果未指定单位, 则假定以度为单位.
示例:
vmd > set a "180 deg north"
180 deg north
vmd > find_rotation_value a
3.14159
vmd > set a
north
vmd > set a "1 pi to eat"
1 pi to eat
vmd > find_rotation_value a
3.14159
vmd > set a
to eat
vmd > set a 45
45
vmd > find_rotation_value a
0.785398
vmd > expr $M_PI * 3.0 / 2.0
4.71239
vmd > set a "4.71238 radians"
4.71238 radians
vmd > find_rotation_value a
4.71238