【问题标题】:define a 4th rank tensor in Maple在 Maple 中定义一个 4 阶张量
【发布时间】:2018-05-12 12:43:40
【问题描述】:

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

谁能告诉我怎么了?

谢谢,

【问题讨论】:

  • 请详细说明尝试过的方法或具体无效的方法。
  • 如果不做所有无意义的循环,代码会更短。为什么不在i1 上进行一个循环来设置零,然后保持零?
  • 抱歉含糊不清。我已经编辑了我的问题。

标签: matlab maple tensor


【解决方案1】:

如果您不坚持使用名称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 代码,那么浮点数可能就是将分配到数组中的全部。有了它,对数组的一些操作可以更快。看看进展如何。

【讨论】:

  • 非常感谢您的全面评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-04
  • 1970-01-01
  • 2017-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多