level 1
怎么违规了
楼主
如题,想要实现“矩阵直乘再乘积等于对应乘积的直乘”运算,可以通过定义
A_\[CircleTimes]B_ := KroneckerProduct[A, B];
kroneckerProductRule = (a_\[CircleTimes]b_) . (c_\[CircleTimes]d_) :> \
(a . c)\[CircleTimes](b . d);
实现。现在想将这个运算推广到多个矩阵,也即 (A \[CircleTimes] B \[CircleTimes]C) . (D \[CircleTimes] E \[CircleTimes] F) = (A . D) \[CircleTimes] (B . E) \[CircleTimes] (C . F),尝试模式匹配后发现不成功,甚至两项矩阵都未能实现想要的结果。请问有没有大佬能解答一下。代码如下:
ClearAll["Global`*"]
mA = {{1, 2}, {3, 4}};
mC = {{1, 0}, {0, -1}};
mE = {{1, 0}, {0, 1}};
mD = {{2, 1}, {1, 0}};
A_\[CircleTimes]B_ := KroneckerProduct[A, B];
kroneckerProductRule = (a_\[CircleTimes]b_) . (c_\[CircleTimes]d_) :> \
(a . c)\[CircleTimes](b . d);
circleTimesRule =
CircleTimes[a___] . CircleTimes[b___] /;
Length[{a}] == Length[{b}] :>
CircleTimes @@ MapThread[Dot, {{a}, {b}}];
Unprotect[KroneckerProduct];
MakeBoxes[KroneckerProduct[a_, b_], StandardForm] :=
RowBox[{MakeBoxes[MatrixForm[a], StandardForm], "\[CircleTimes]",
MakeBoxes[MatrixForm[b], StandardForm]}];
Protect[KroneckerProduct];
(mA\[CircleTimes]mB) . (mE\[CircleTimes]mF)
(mA\[CircleTimes]mB) . (mE\[CircleTimes]mF) //. circleTimesRule
(mA\[CircleTimes]mB) . (mE\[CircleTimes]mF) //. kroneckerProductRule
运行结果如图:

2024年10月31日 11点10分
1
A_\[CircleTimes]B_ := KroneckerProduct[A, B];
kroneckerProductRule = (a_\[CircleTimes]b_) . (c_\[CircleTimes]d_) :> \
(a . c)\[CircleTimes](b . d);
实现。现在想将这个运算推广到多个矩阵,也即 (A \[CircleTimes] B \[CircleTimes]C) . (D \[CircleTimes] E \[CircleTimes] F) = (A . D) \[CircleTimes] (B . E) \[CircleTimes] (C . F),尝试模式匹配后发现不成功,甚至两项矩阵都未能实现想要的结果。请问有没有大佬能解答一下。代码如下:
ClearAll["Global`*"]
mA = {{1, 2}, {3, 4}};
mC = {{1, 0}, {0, -1}};
mE = {{1, 0}, {0, 1}};
mD = {{2, 1}, {1, 0}};
A_\[CircleTimes]B_ := KroneckerProduct[A, B];
kroneckerProductRule = (a_\[CircleTimes]b_) . (c_\[CircleTimes]d_) :> \
(a . c)\[CircleTimes](b . d);
circleTimesRule =
CircleTimes[a___] . CircleTimes[b___] /;
Length[{a}] == Length[{b}] :>
CircleTimes @@ MapThread[Dot, {{a}, {b}}];
Unprotect[KroneckerProduct];
MakeBoxes[KroneckerProduct[a_, b_], StandardForm] :=
RowBox[{MakeBoxes[MatrixForm[a], StandardForm], "\[CircleTimes]",
MakeBoxes[MatrixForm[b], StandardForm]}];
Protect[KroneckerProduct];
(mA\[CircleTimes]mB) . (mE\[CircleTimes]mF)
(mA\[CircleTimes]mB) . (mE\[CircleTimes]mF) //. circleTimesRule
(mA\[CircleTimes]mB) . (mE\[CircleTimes]mF) //. kroneckerProductRule
运行结果如图:
