【问题标题】:Basic question from a beginner. Problem with definitions in a bucle. Maple初学者的基本问题。 bucle 中的定义存在问题。枫
【发布时间】:2018-11-22 18:06:20
【问题描述】:

假设我们在这种情况下(我正在使用 Maple)

add:=function()
e1:=0;
e2:=1;
for j in [1..2]do
ej:=ej+1
od;
return e1,e2;
end;

这个程序给了我一个全局变量错误。我理解为什么会发生这种情况——因为ej 没有被定义为本地——但如果你定义它,那么程序就什么也不做。 ) 我不知道如何解决它。 我的目标(在更大的程序中)是在 for 循环中调用 e1,e2

也许我没有正确表达自己以简化我的问题,有我的程序,它是用程序 GAP 制作的,但它的工作原理类似于 Maple:

G12Decode:=function(c)
localx,G,C,sG,sH,a,u,b1,e1,b2,e2,b3,e3,b4,e4,b5,e5,b6,e6,h1,h2,i,j; 
x:=Codeword(c,GF(3));
G:=[[1,0,0,0,0,0,0,1,1,1,1,1],[0,1,0,0,0,0,1,0,1,2,2,1], 
[0,0,1,0,0,0,1,1,0,1,2,2],[0,0,0,1,0,0,1,2,1,0,1,2], 
[0,0,0,0,1,0,1,2,2,1,0,1],[0,0,0,0,0,1,1,1,2,2,1,0]];
C:=GeneratorMatCode(G,GF(3));
sG:=x*TransposedMat(GeneratorMat(C));
sH:=x*TransposedMat(CheckMat(C));
a:=[0,0,0,0,0,0];
b1:=Codeword([0,1,1,1,1,1],GF(3)); 
e1:=Codeword([1,0,0,0,0,0],GF(3));
b2:=Codeword([1,0,1,2,2,1],GF(3)); 
e2:=Codeword([0,1,0,0,0,0],GF(3));
b3:=Codeword([1,1,0,1,2,2],GF(3)); 
e3:=Codeword([0,0,1,0,0,0],GF(3));
b4:=Codeword([1,2,1,0,1,2],GF(3)); 
e4:=Codeword([0,0,0,1,0,0],GF(3));
b5:=Codeword([1,2,2,1,0,1],GF(3)); 
e5:=Codeword([0,0,0,0,1,0],GF(3));
b6:=Codeword([1,1,2,2,1,0],GF(3)); 
e6:=Codeword([0,0,0,0,0,1],GF(3));

if Weight(sH)<=2 then
sH:=ShallowCopy(VectorCodeword(sH));
Append(a,sH);
a:=Codeword(a,GF(3));
u:=x-a;
return u;
elif Weight(sG)<=2 then
sG:=ShallowCopy(VectorCodeword(sG));
Append(sG,a);
sG:=Codeword(sG,GF(3));
u:=x-sG;
return u;
else
for i in [1..6] do
for j in [1..6] do
if sG-bi=ej or sG-bi=2*ej then 
h1:=sG-bi;
h2:=ei;
h1:=ShallowCopy(VectorCodeword(h1));
h2:=ShallowCopy(VectorCodeword(h2));
Append(h1,h2);
h1:=Codeword(h1,GF(3));
u:=x-h1;
return u;
elif sG-2*bi=ej or sG-2*bi=2*ej then
h1:=sG-2*bi;
h2:=ei;
h1:=ShallowCopy(VectorCodeword(h1));
h2:=ShallowCopy(VectorCodeword(h2));
Append(h1,h2);
h1:=Codeword(h1,GF(3));
u:=x-h1;
return u;
fi;
od;
od;
fi;
end;

该程序不会向我发送错误消息,但我知道由于 ej、bi 和 ei 它无法正常工作。我想做最后一个“else”之后所说的内容,但我不知道如何解决它以使其正常工作。

【问题讨论】:

  • 感谢您浪费我的时间标记此maple,而事实上这完全是关于 GAP 计划的。不,它们的工作方式不同。语言语法有 一些 相似之处,但只有 Maple 没有人可以运行它。无论如何,在 GAP 中,您真的可以引用 biej 并神奇地获取 b3e4 的值,如果 i=3j=4 作为循环索引的值?!?听起来很可疑。也许 GAP 允许您连接名称。或者您可以改为将be 声明为数组(类似于上面的a?),然后在b[i]e[j] 等中存储/引用。
  • @acer 很抱歉。但是你对 Maple 的回答也是必要的,因为我也在努力。无论如何,我试过你说的,它奏效了,谢谢。再次对此感到抱歉。

标签: for-loop maple


【解决方案1】:

您的语法无效。它是 proc,而不是 function

add 已经是 Maple 命令,所以它是一个受保护的名称,不能分配给它。您必须使用其他名称。

而且你的 do-loop 语法可能不是你想要的。你可能想要 for j from 1 to 2 do

在执行递归赋值 ej:=ej+1 之前,您确实应该用一个值初始化 ej

您不妨声明过程的本地变量。

就个人而言,我更喜欢使用 end do 而不是 od ,以及 end proc 而不是 end ,在现代枫树。它可以更轻松地判断正在终止的内容。

例如,

restart;

my_add:=proc()
  local e1,e2,ej,j;
  e1:=0;
  e2:=1;
  ej:=0;
  for j from 1 to 5 do
    ej:=ej+1
  end do;
  return ej,e1,e2;
end proc:

my_add();

                 5, 0, 1

有一个Maple Programming Guide,您可以在线阅读或在 Maple 自己的帮助系统中阅读。它有一个很好的introduction to writing proceduresproc 命令还有更详细的帮助页面。

【讨论】:

  • 我在问题中添加了一些内容。很抱歉之前没有正确解释。
猜你喜欢
  • 2023-02-24
  • 1970-01-01
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 2014-06-03
  • 2023-03-04
  • 1970-01-01
相关资源
最近更新 更多