2010-03-17 136 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);