我正在試圖製作一個100×100三對角矩陣,其中2對角線和-1圍繞着2。我可以製作一個三對角線矩陣,其中只有三個對角線中的1和預製棒矩陣,以獲得我想要的,但是我想知道是否有方法來定製三個對角線以滿足您的需要。 maplehelp沒有列出任何有用的東西。maple 13三對角矩陣幫助
回答
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);
LinearAlgebra [BandMatrix]工作過(並且會更快WAY),特別是如果你使用的存儲=頻段[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呼叫,這將給你一個矩陣,但是你可以改變你想:
Matrix(LinearAlgebra:-BandMatrix([1,2,1], 1, 100));
涉及的初始化函數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);