Math 枫树13三对角矩阵帮助

Math 枫树13三对角矩阵帮助,math,maple,Math,Maple,我试着做一个100x100的三对角矩阵,2沿着对角线向下,1围绕着2。我可以制作一个三对角矩阵,其中三条对角线中只有1,并添加预成型矩阵,以得到我想要的,但我想知道是否有办法定制三条对角线,以满足您的需求。maplehelp没有列出任何有用的内容。可以使用参数init调用LinearGebra包中的矩阵函数,该函数可以根据矩阵的位置为每个条目赋值。 这将有助于: f := (i, j) -> if i = j then 2 elif abs(i - j) = 1 then -1 else

我试着做一个100x100的三对角矩阵,2沿着对角线向下,1围绕着2。我可以制作一个三对角矩阵,其中三条对角线中只有1,并添加预成型矩阵,以得到我想要的,但我想知道是否有办法定制三条对角线,以满足您的需求。maplehelp没有列出任何有用的内容。

可以使用参数init调用LinearGebra包中的矩阵函数,该函数可以根据矩阵的位置为每个条目赋值。 这将有助于:

f := (i, j) -> if i = j then 2 elif abs(i - j) = 1 then -1 else 0; end if;
Matrix(100, f);

可以使用参数init调用LinearGebra包中的矩阵函数,该参数init是一个函数,可以根据矩阵的位置为每个条目分配值。 这将有助于:

f := (i, j) -> if i = j then 2 elif abs(i - j) = 1 then -1 else 0; end if;
Matrix(100, f);

LinearAlgebra[BandMatrix]也可以工作,而且速度会快得多,特别是当您使用storage=band[1]时。您可能也应该使用shape=symmetric

linearlgebra[BandMatrix]也能工作,而且速度会快得多,特别是当您使用storage=band[1]时。您可能也应该使用shape=symmetric

jmbr提出的解决方案可适用于:

f := proc(i, j) if i = j then 2 elif abs(i - j) = 1 then -1 else 0 end if end proc; Matrix(100, f); 另外,我理解你的评论,你说你以后需要破坏BandMatrix的性质,它阻止你使用BandMatrix,是吗?最简单的解决方案是将BandMatrix调用封装在常规矩阵调用中,这将为您提供一个可以随意更改的矩阵:

Matrix(LinearAlgebra:-BandMatrix([1,2,1], 1, 100));
jmbr提出的解决方案可适用于:

f := proc(i, j) if i = j then 2 elif abs(i - j) = 1 then -1 else 0 end if end proc; Matrix(100, f); 另外,我理解你的评论,你说你以后需要破坏BandMatrix的性质,它阻止你使用BandMatrix,是吗?最简单的解决方案是将BandMatrix调用封装在常规矩阵调用中,这将为您提供一个可以随意更改的矩阵:

Matrix(LinearAlgebra:-BandMatrix([1,2,1], 1, 100));
对于平方nxn矩阵,涉及初始化函数f的答案将在^2上完成。理想情况下,此任务应处于打开状态,因为要填写的条目数仅少于3*n

假设你想得到一个没有任何特殊功能的矩阵,比如带存储或索引功能,这样你以后就可以任意写入矩阵的任何部分。另外,假设您不想通过使用另一个通用矩阵调用包装带结构矩阵来回避这样的问题,这将使所使用的临时内存加倍,并产生可回收的垃圾

这里有两种方法可以做到这一点,而无需以On^2方式将f应用于每个条目,或使用单独的do循环。第一个是创建三个临时段,临时段是要收集的垃圾,但至少不是n^2大小的垃圾

M:=Matrix100,[[-1$99],[2$100],-1$99]],扫描=波段[1,1]

第二种方法使用一个例程,该例程遍历M并用三个标量值填充它,因此不需要显式地使用三个带列表

M:=Matrix100:

阵列工具:-填充100,2,M,0100+1

阵列工具:-填充99,-1,M,1100+1

阵列工具:-Fill99,-1,M,100100+1

请注意,ArrayTools:-Fill是一个编译的外部例程,因此原则上可能比解释的Maple语言适当的方法要快。对于具有“float[8]”这样的硬件数据类型的矩阵M来说,速度尤其快

顺便说一句,上面的arrow过程因错误无效arrow过程而失败的原因可能是它是在2D数学模式下输入的。Maple 13的2D数学解析器不理解作为箭头运算符主体的if…then…end语法。除了像其他人回答的那样将f作为过程写入外,其他方法是在1D Maple符号模式下输入f unedited,或者编辑f以使用if的运算符形式。这里if的运算符形式可能需要嵌套if来处理elif。比如说,

f := (i,j) -> `if`(i=j,2,`if`(abs(i-j)=1,-1,0));
Matrix(100,f);

对于平方nxn矩阵,涉及初始化函数f的答案将在^2上完成。理想情况下,此任务应处于打开状态,因为要填写的条目数仅少于3*n

假设你想得到一个没有任何特殊功能的矩阵,比如带存储或索引功能,这样你以后就可以任意写入矩阵的任何部分。另外,假设您不想通过使用另一个通用矩阵调用包装带结构矩阵来回避这样的问题,这将使所使用的临时内存加倍,并产生可回收的垃圾

这里有两种方法可以做到这一点,而无需以On^2方式将f应用于每个条目,或使用单独的do循环。第一个是创建三个临时段,临时段是要收集的垃圾,但至少不是n^2大小的垃圾

M:=Matrix100,[[-1$99],[2$100],-1$99]],扫描=波段[1,1]

第二种方法使用一个例程,该例程遍历M并用三个标量值填充它,因此不需要显式地使用三个带列表

M:=Matrix100:

阵列工具:-填充100,2,M,0100+1

阵列工具:-填充99,-1,M,1100+1

阵列工具:-Fill99,-1,M,100100+1

请注意,ArrayTools:-Fill是一个已编译的外部程序 所有的例程,因此原则上可能比解释的Maple语言正确的方法要快。对于具有“float[8]”这样的硬件数据类型的矩阵M来说,速度尤其快

顺便说一句,上面的arrow过程因错误无效arrow过程而失败的原因可能是它是在2D数学模式下输入的。Maple 13的2D数学解析器不理解作为箭头运算符主体的if…then…end语法。除了像其他人回答的那样将f作为过程写入外,其他方法是在1D Maple符号模式下输入f unedited,或者编辑f以使用if的运算符形式。这里if的运算符形式可能需要嵌套if来处理elif。比如说,

f := (i,j) -> `if`(i=j,2,`if`(abs(i-j)=1,-1,0));
Matrix(100,f);