首页 > 解决方案 > 在 Maple 中定义一个 4 阶张量

问题描述

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

谁能告诉我怎么了?

谢谢,

标签: matlabmapletensor

解决方案


如果你不坚持使用 name 会更容易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 维数组,其中每个维度的宽度为三个元素。并且三个“长对角线”元素都初始化为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 版本足够新以支持该路线,那么您可能还想更改虚数单位(-1 的平方)的接口设置,以免事情变得太混乱. 这就是我在上面的第一个示例中展示它的原因。

但我真的认为如果你只是使用另一个名字,你会发现事情最简单,比如II你有什么。

您不需要datatype=float[8]对数组进行限制。但是,如果您的后续代码模仿了一些(最初的)Matlab 代码,那么浮点数可能就是将分配到数组中的全部。有了它,对数组的一些操作可以更快。看看情况如何。


推荐阅读