在Maple中定义第4级张量

时间:2018-05-12 12:43:40

标签: matlab maple tensor

我是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

有人可以告诉我出了什么问题吗?

谢谢,

1 个答案:

答案 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代码,则可能浮点数将被分配到数组中。使用它,对阵列的一些操作可以更快。看看它如何。