我是Maple的新手。你能帮我把以下短代码从Matlab转换成Maple:
I=0.0;
for i1=1:3
I(i1,i1,i1,i1)=1.0;
end
我试着把它写成:
unprotect(I);
I:=0.0;
for i1 from 1 to 3 do
for i2 from 1 to 3 do
for i3 from 1 to 3 do
for i4 from 1 to 3 do
if i1=i2 and i2=i3 and i3=i4 then I[i1,i2,i3,i4]:=1.0;
else I[i1,i2,i3,i4]:=0.0;
end if;
od;
od;
od;
od;
但它会出现以下错误:
Error, illegal use of an object as a name
Error, illegal use of an object as a name
有人可以告诉我出了什么问题吗?
谢谢,
答案 0 :(得分:0)
如果你不坚持使用名称I
会更容易,在Maple中它具有-1的sqrt的特殊含义。
restart;
interface(imaginaryunit=j):
local I:=Array((1..3)$4,datatype=float[8]);
for i1 from 1 to 3 do
I[i1,i1,i1,i1]:=1.0;
end do:
以上产生I
作为4维数组,其中每个维度的宽度为3个元素。并且三个“长对角线”元素都被初始化为1.0。并且Array可以包含硬件双精度浮点数。所有其他元素默认为0.0。
这是你想要做的吗?
如果您不坚持要求将其指定为特殊名称I
,那么事情会更容易。例如,
restart;
II:=Array((1..3)$4,datatype=float[8]):
for i1 from 1 to 3 do
II[i1,i1,i1,i1]:=1.0;
end do:
仅仅通过取消保护,您无法正确覆盖/禁用I
的特殊含义。 (即使你可以,解除保护和重新定义I
是一个不可行的想法,因为很大一部分Maple命令将不再在给定的会话中正确计算。)
最新版本的Maple允许您创建该名称的所谓顶级“本地”实例,该实例可以与通常的全局名称I
分开使用。如果你坚持这条路线,如果你的Maple版本足够支持,那么你可能也想改变
虚构单元的接口设置(sqrt为-1),这样事情就不会太混乱。这就是我在上面第一个例子中展示它的原因。
但我真的认为如果你只是使用其他名称,例如II
或者你有什么,你会发现最简单的事情。
您无需在数组上加上datatype=float[8]
限制。但是如果您的后续代码模仿了一些(最初的)Matlab代码,则可能浮点数将被分配到数组中。使用它,对阵列的一些操作可以更快。看看它如何。