对于您的原始表述,@WReach 给出了一个很好的答案。但是,重新考虑您的设计可能是有意义的:请注意,d 的值(取决于输入参数)无论如何。可选参数正是为此而设计的 - 可选。在您的情况下,默认参数似乎更合适。您可以使用Automatic 进行设置,类似于@WReach 的建议:
dimMAuto[a_?MatrixQ, d_: Automatic] :=
If[d === Automatic, Dimensions[a], d];
要在代码中的多个位置使用它,您需要引入一个辅助变量或常量(使用With 或Module)来存储这个值。作为替代方案,您还可以使用以下代码:
Module[{dims},
dimM[a_?MatrixQ, d_: dims] :=
Block[{dims = Dimensions[a]},
d]
]
它的优点是您可以在函数体的任何地方使用相同的原始参数d。这里发生的事情相当重要:Module 用于生成唯一符号,然后将其作为 d 的默认值并用于动态计算尺寸。请注意,Block 本地化的不是符号 dims,而是由 Module 生成的唯一符号,如 dims$77542。 Module 和 Block 的这种组合使这种技术完全安全。使用示例:
In[1466]:= dimM[IdentityMatrix[3],{1,1}]
Out[1466]= {1,1}
In[1467]:= dimM[IdentityMatrix[3]]
Out[1467]= {3,3}
我认为Module 和Block 的这种组合是一种有趣的技术,它可能会找到其他用途。从本质上讲,它是通过词法作用域(或更准确地说,它在 Mathematica 中的模仿)使动态作用域变得安全的一个版本——因为动态作用域的主要危险之一是同名的动态本地化符号的无意冲突。
关于一个不相关的问题 - 最好不要以大写字母开头变量和函数,因为它们可能会与系统符号发生冲突。