2010-03-17 132 views
1

我正在试图制作一个100×100三对角矩阵,其中2对角线和-1围绕着2。我可以制作一个三对角线矩阵,其中只有三个对角线中的1和预制棒矩阵,以获得我想要的,但是我想知道是否有方法来定制三个对角线以满足您的需要。 maplehelp没有列出任何有用的东西。maple 13三对角矩阵帮助

回答

3

LinearAlgebra包中的Matrix函数可以用一个参数(init)调用,该函数可以根据矩阵的位置为矩阵的每个条目赋值。
这会工作:

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

LinearAlgebra [BandMatrix]工作过(并且会更快WAY),特别是如果你使用的存储=频段[1]。你也应该使用shape = symmetric。

0

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呼叫,这将给你一个矩阵,但是你可以改变你想:

 Matrix(LinearAlgebra:-BandMatrix([1,2,1], 1, 100));
1

涉及的初始化函数f会做○答案( n^2)为nxn矩阵工作。理想情况下,这个任务应该是O(n),因为只有少于3 * n条目要填写。

假设您还想要一个没有任何特殊(例如波段)存储或索引函数的结果矩阵(以便稍后可以随意写入它的任何部分)。并且假设你不想绕过带Matrix结构的另一个通用Matrix()调用来解决这个问题,该调用会使使用的临时内存翻倍并产生可收集的垃圾。

这里有两种方法可以做到这一点(不需要以O(n^2)方式对每个条目应用f或使用单独的do循环)。第一个涉及创建三个乐队作为临时(这是垃圾收集,但至少不是n^2大小)。 M:= Matrix(100,[[ - 1 $ 99],[2 $ 100],[ - 1 $ 99]],scan = band [1,1]);

这第二种方式使用一个例程,它遍历M并用三个标量值填充它(因此不需要明确指定3个带子列表)。

L:=矩阵(100):

ArrayTools:-fill(100,2,M 0100 + 1);

ArrayTools:-Fill(99,-1,M,1,100 + 1);

ArrayTools:-Fill(99,-1,M,100,100 + 1);

请注意,ArrayTools: - 填充是一个编译的外部例程,因此在主体中可能比解释的Maple语言(正确)方法快。对于具有诸如'float [8]'之类的硬件数据类型的Matrix M来说,这将尤其快速。

顺便说一句,上述箭头程序失败的原因是错误“无效的箭头程序”很可能是它在2D数学模式下输入的。 Maple 13的2D数学解析器不理解if ... then ... end语法作为箭头运算符的主体。替代方法(除了像其他人所回答的那样将f写为proc)是在1D Maple表示法模式下输入f(未编辑),或者编辑f以使用if的运算符格式。也许这里的if的运算符格式需要嵌套的if来处理elif。例如,

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