公告:本站正式转型为非交互式静态网站!
转型:本站将通过笔记和博客的形式继续为大家服务,关于 Mathematica 问答服务请移步至QQ群:365716997
联系:如有问题请联系QQ群管理员,或发送邮件至:lixuan.xyz@qq.com。
感谢:最后非常感谢大家多年来的支持与帮助!
参考《互联网跟帖评论服务管理规定》《中华人民共和国网络安全法》《网络信息内容生态治理规定》《互联网用户账号信息管理规定》

—— 2022-11-27

欢迎来到 Mathematica 问答社区

提问时请贴上文本代码

语法高亮:在编辑器中点击

被禁止的话题:广告破解

请阅读:《提问的智慧》

备用域名:mma.ooo

支持LaTex数学公式
行内公式标识符:\$ 或“$\backslash ($”+“$\backslash )$”,
行间公式标识符:\$\$ 或 “$\backslash [$”+“$\backslash ]$”

社区建议QQ群:365716997

分类

+1 投票
2.9k 浏览
数的循环相乘有命令, 如Product[x+i,{i,1,3}]得到(x+1)(x+2)(x+3)。 我想要一个结果如a.b.a.b^2.a.b^3.......的矩阵连乘,有直接的命令吗?如果没有怎样写成一个函数?得到f(m)=:a.b.a.b^2.........a.b^m。请大侠们帮忙啊!!!
分类:矩阵 | 用户: sxuuxs (46 分)

2 个回答

+1 投票
f[a_, b_, m_] := Dot @@ Flatten[Table[{a, b^i}, {i, m}]]

涉及到的函数,Table,Flatten,Apply,Dot。

用户: 苹果 (2.2k 分)
修改于 用户:苹果
+1 投票

如果矩阵较大的话可以试试

f[a_, b_, m_] :=
 Nest[{x = First@#.b, Last@#.x} &, {#, #} &[a.b], m - 1] // Last

能少算几次乘法

用户: 瓦屋青衣 (321 分)
按道理少算几次乘法运算用时会快点,但是在mma里面这种算法没有@苹果的算法快呢,其中发生了什么。。。
看看你的测试数据和结果比较
No.1 大m
a = {{1., 0.}, {0., 1.}}; b = {{2., 0.}, {0., 1.}};
f1[a_, b_, m_] := Dot @@ Flatten[Table[{a, b^i}, {i, m}]];
f2[a_, b_, m_] :=
  Nest[{x = First@#.b, Last@#.x} &, {#, #} &[a.b], m - 1] // Last;
f1[a, b, 10000]; // AbsoluteTiming
f2[a, b, 10000]; // AbsoluteTiming
{0.051003, Null}
{0.100006, Null}

No.2 大矩阵
a = IdentityMatrix[100]; b = DiagonalMatrix[Range[100]];
f1[a_, b_, m_] := Dot @@ Flatten[Table[{a, b^i}, {i, m}]];
f2[a_, b_, m_] :=
  Nest[{x = First@#.b, Last@#.x} &, {#, #} &[a.b], m - 1] // Last;
f1[a, b, 500]; // AbsoluteTiming
f2[a, b, 500]; // AbsoluteTiming
{0.874050, Null}
{7.368421, Null}
你有比较过两者结果相等没?
谢谢,确实@苹果的答案有点问题啊,而且即便改成Dot @@ Flatten[Table[{a, b^i}, {i, m}],1]的话还是不行啊,矩阵的n次方在mma里不是矩阵^n,mma里的矩阵^n是矩阵各元素的n次方,进一步改正@苹果的答案为Dot @@ Flatten[Table[{a, MatrixPower[b, i]}, {i, m}], 1]。

这样就合乎道理了,计算次数少的用时少。
No.1 大m
a = {{1., 0.}, {0., 1.}}; b = {{2., 0.}, {0., 1.}};
f1[a_, b_, m_] :=
  Dot @@ Flatten[Table[{a, MatrixPower[b, i]}, {i, m}], 1];
f2[a_, b_, m_] :=
  Nest[{x = First@#.b, Last@#.x} &, {#, #} &[a.b], m - 1] // Last;
ans1 = f1[a, b, 2000]; // AbsoluteTiming
ans2 = f2[a, b, 2000]; // AbsoluteTiming
Norm[ans1 - ans2]
{0.150008, Null}
{0.019001, Null}
0.

No.2 大矩阵
a = IdentityMatrix[100]; b = DiagonalMatrix[Range[100]];
f1[a_, b_, m_] :=
  Dot @@ Flatten[Table[{a, MatrixPower[b, i]}, {i, m}], 1];
f2[a_, b_, m_] :=
  Nest[{x = First@#.b, Last@#.x} &, {#, #} &[a.b], m - 1] // Last;
ans1 = f1[a, b, 200]; // AbsoluteTiming
ans2 = f2[a, b, 200]; // AbsoluteTiming
Norm[ans1 - ans2]
{7.696440, Null}
{1.705098, Null}
0
...