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

—— 2022-11-27

欢迎来到 Mathematica 问答社区

提问时请贴上文本代码

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

被禁止的话题:广告破解

请阅读:《提问的智慧》

备用域名:mma.ooo

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

社区建议QQ群:365716997

分类

+1 投票
4.3k 浏览
请问一下:
定义
{c[1], c[2], c[3]} = {1, 2, 3};
后,
在 {c[1], c[2], c[3]} 保持有赋值的情况下,
是否还能将 Array[c, 3] 展开成 {c[1], c[2], c[3]} 的形式,但不代入数值?
即,有没有办法控制对 Array[c, 3] 的计算在代入数值那一步之前停下来(并输出结果)?
用户: wonderlands0 (451 分)

1个回答

+2 投票
 
已采纳

这样?

{c[1], c[2], c[3]} = {1, 2, 3};
ccc = Trace[Array[c, 3]][[2]]
ccc // ReleaseHold

 

用户: 野鹤 (5.1k 分)
采纳于 用户:wonderlands0
我说的基本就是这个意思,就是对 Array[c,3] 的计算中止到展开为止。哈哈哈,Trace 也算是做到了这件事。赞一下。
基于此我又想了一下,写成 Trace[Array[c, 3], Evaluate@Table[c[_], 3]] 更好,这样可以在整个 Trace 的过程中对 c[i] 的数值没有代入。
然而得到的 {c[1], c[2], c[3]} 是被Hold住的,不能对其再次赋值。ReleaseHold 后又重新变为原先的赋值。
你最好把最终目的说出来。
要不然还得一点点儿的改。
也许不应该通过“{c[1],c[2],c[3]}”这种函数的方式来解决你的问题,比如脚标可能更合适。
下面是继续上面的回答的修改方案。
{c[1], c[2], c[3]} = {1, 2, 3};
ccc = Trace[Array[c, 3]][[2]]
ToExpression[ToString[ccc] <> "=" <> ToString[{4, 5, 6}]];
{c[1], c[2], c[3]}
啊也是没想到得到的结果会自带 HoldForm 。因为想尽量用最少的语言表述问题,所以开始没说很充分。
看来必须用这种曲折的办法了。。。
谢谢!
根据不同目的,解决方案应该有多种的,这应该不是最优的哦。
Mr. Wizard写过一个基于这个原理的函数:https://mathematica.stackexchange.com/a/1447/1871
但 step[{c[1], c[2], c[3]}] 被计算了。
嗯,链接是很好的内容!
看了野鹤的回答又看了SE上的类似问题,现在明白,看来MMA里没有针对原始函数其内部运算的 evaluation control 。
因为那个函数就是控制计算进行一次啊……你从显式的表开始计算一次当然就变数字了……其实对于此类控制我比较喜欢基于模式匹配的那个思路,能达成的效果差不多,但模式匹配更好懂。
嗯嗯。------
...