我正在尝试制作一个100 x 100三对角矩阵,其中2个沿着对角线向下,-1围绕着2个。我可以制作一个三对角矩阵,在三个对角线中只有1个,并且预成型矩阵添加以获得我想要的东西,但我想知道是否有一种方法可以根据您的需要自定义三个对角线。 maplehelp没有列出任何有用的东西。
答案 0 :(得分:3)
可以使用参数(init)调用LinearAlgebra包中的Matrix函数,该参数是一个函数,可以根据矩阵的位置为矩阵的每个条目赋值。 这可行:
f := (i, j) -> if i = j then 2 elif abs(i - j) = 1 then -1 else 0; end if;
Matrix(100, f);
答案 1 :(得分:1)
LinearAlgebra [BandMatrix]也可以工作(并且速度更快),特别是如果你使用storage = band [1]。你应该使用shape = symmetric。
答案 2 :(得分:1)
涉及初始化函数f
的答案将对方形nxn矩阵执行O(n ^ 2)工作。理想情况下,此任务应为O(n),因为要填充的条目少于3 * n。
假设您想要一个没有任何特殊(例如带)存储或索引功能的结果矩阵(这样您以后可以随意写入它的任何部分)。并且假设你不想通过将带结构Matrix与另一个通用的Matrix()调用包装起来来解决这个问题,这会使得使用的临时内存加倍并产生可收集的垃圾。
以下是两种方法(不以O(n ^ 2)方式对每个条目应用f,或使用单独的do循环)。第一个涉及创建三个带作为临时(这是垃圾收集,但至少不是n ^ 2大小)。
L:=矩阵(100,[[ - 1 $ 99],[2 $ 100],[ - 1 $ 99]],扫描=带[1,1]);
第二种方法使用一个例程,该例程遍历M并仅使用三个标量值填充它(因此不需要明确地显示3个波段列表。)
L:=矩阵(100):
ArrayTools:-fill(100,2,M 0100 + 1);
ArrayTools:-fill(99,-1,M,1100 + 1);
ArrayTools:-fill(99,-1,M,100100 + 1);
请注意,ArrayTools:-Fill是一个已编译的外部例程,因此在本机中可能比解释的Maple语言(正确)方法更快。对于具有硬件数据类型的Matrix M,例如'float [8]',它会特别快。
顺便说一下,上面的箭头程序失败且错误“无效箭头程序”的原因可能是它是在2D数学模式下输入的。 Maple 13的2D Math解析器不理解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);
答案 3 :(得分: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调用中,这将为您提供一个可以根据需要更改的矩阵:
Matrix(LinearAlgebra:-BandMatrix([1,2,1], 1, 100));