我想根据索引生成对称矩阵和反对称矩阵, 自己写的代码如下
matcon[imd_, id_] := Module[{mdr, mdi}, mdr =
Block[{ta, im},
ta = Table[
IdentityMatrix[id], {j, 1, imd}];(*根据表示的维度构建单位矩阵,数量与多项式的数目相同*)
im = 0;
Do[Do[im = im + 1;
ta[[i, ii, ij]] = dc[im], {ii, 1, id}, {ij, ii, id}], {i, 1,
imd}];(*i索引ta保存的每一个单位矩阵,ii和ij则是单位矩阵中元素的索引*)
Do[Do[
ta[[j, ij, ii]] = ta[[j, ii, ij]], {ii, 1, id}, {ij, ii,
id}], {j, 1, imd}];(*这里是对矩阵中的元素做出一些限制,
也就是令ij位置元素和ji位置元素相同,即对称矩阵要求ij=ji*)
ta];
mdi =
Block[{ta, im},
ta = Table[
IdentityMatrix[id], {j, 1, imd}];(*这里根据多项式展开的数量来确定需要构建的单位矩阵的数量*)
im = Sum[i, {i, id}]*
imd;(*这里就是构建一个对称矩阵和反对称矩阵来表示厄米的哈密顿量,而自然这两种矩阵中的参数是要不相同的,所以这里就是用im这\
个索引来区分这些参数,因此在这里的时候使用到的所以就是在上面一个矩阵索引的基础上继续进行叠加,所以这里也就是为什么tdc要构建的dc的数量是\
(Sum[i,{i,id}]+Sum[i,{i,id-1}])*imd个*)
Do[Do[
If[ii == ij, ta[[i, ii, ij]] = 0, im = im + 1;
ta[[i, ii, ij]] = I*dc[im]], {ii, 1, id}, {ij, ii, id}], {i, 1,
imd}];(*此时限制对角元素为零,非对角和mdr相同只不过乘以了虚数I*)
Do[Do[
ta[[j, ij, ii]] = - ta[[j, ii, ij]], {ii, 1, id}, {ij, ii,
id}], {j, 1, imd}];(*此时给出的是限制矩阵为反对称矩阵:ij=-ji*)
ta]; {mdr, mdi}]
a1 = matcon[4, 4];
a1[[1]][[1]] // MatrixForm
但是这个操作觉得有点繁琐, 想找个快捷点的方式.