2017-01-30 3 views
0

Я решаю линейную систему, в которой матрица является трехдиагональной. Пусть B - трехдиагональная матрица 99 на 99 с 4 на главной диагонали и -1 на двух поддиагонах и I - 99-точечная матрица. Я хочу сохранить блочную трехдиагональную матрицу А размером 99^2 на 99^2, основная диагональ которой равна В, а поддиагонали - -I. Каков наиболее эффективный способ сделать это? Я пришел в одну сторону:Как мы можем эффективно хранить блочную трехдиагональную матрицу в MATLAB?

t1=ones(99,1); 
t2=ones(98,1); 
B=4*diag(t1)-diag(t2,-1)-diag(t2,1); 
I=diag(t1); 
Bp=repmat({B}, 99, 1); 
M = blkdiag(Bp{:}); 
t3=ones(9702,1); 
I=zeros(9801)-diag(t3,-99)-diag(t3,99); 
A=M+I; 

Я не уверен, является ли это наиболее эффективным способом для этого. Любые другие возможные подходы к этому?

+0

магазин как разреженная матрица https://uk.mathworks.com/help/ matlab/ref/sparse.html (если у вас есть достаточно новая версия) – Richard

+1

@ Richard «Введена перед R2006a» - Думаю, не большая опасность не иметь достаточно новой версии. – beaker

+0

@ Richard Редкие матрицы были введены в MATLAB около версии 7.0 (около 2004 года). Версии MATLAB этого старого не могут работать в большинстве операционных систем в настоящее время, поэтому можно с уверенностью сказать, что любой текущий пользователь MATLAB будет иметь версию, которая старше 7.0. – rayryeng

ответ

4

Как насчет этого с помощью spdiags:

B_size = 99; 
A_size = B_size^2; 

v = ones(A_size,1); 
D = [v*-1, v*-1, v*4, v*-1, v*-1]; 
A = spdiags(D, [-B_size, -1, 0, 1, B_size], A_size, A_size); 

Вот пример вывода для B_size = 4:

D = 

    -1 -1 4 -1 -1 
    -1 -1 4 -1 -1 
    -1 -1 4 -1 -1 
    -1 -1 4 -1 -1 
    -1 -1 4 -1 -1 
    -1 -1 4 -1 -1 
    -1 -1 4 -1 -1 
    -1 -1 4 -1 -1 
    -1 -1 4 -1 -1 
    -1 -1 4 -1 -1 
    -1 -1 4 -1 -1 
    -1 -1 4 -1 -1 
    -1 -1 4 -1 -1 
    -1 -1 4 -1 -1 
    -1 -1 4 -1 -1 
    -1 -1 4 -1 -1 

Колонки каждый представляет диагональ в нашей разреженной матрицей. Второй параметр [-B_size -1 0 1 B_size] в вызове spdiags указывает, для какой диагонали поставить каждый столбец (отрицательные числа ниже основной диагонали, положительные числа выше). Ненужные значения из векторов столбцов (нижние значения для отрицательных диагоналей, верхние значения для положительных диагоналей) игнорируются.

A является разреженной матрицей, поэтому я покажу full(A), так что вы можете увидеть, что это на самом деле выглядит следующим образом:

>> full(A) 
ans = 

    4 -1 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 
    -1 4 -1 0 0 -1 0 0 0 0 0 0 0 0 0 0 
    0 -1 4 -1 0 0 -1 0 0 0 0 0 0 0 0 0 
    0 0 -1 4 -1 0 0 -1 0 0 0 0 0 0 0 0 
    -1 0 0 -1 4 -1 0 0 -1 0 0 0 0 0 0 0 
    0 -1 0 0 -1 4 -1 0 0 -1 0 0 0 0 0 0 
    0 0 -1 0 0 -1 4 -1 0 0 -1 0 0 0 0 0 
    0 0 0 -1 0 0 -1 4 -1 0 0 -1 0 0 0 0 
    0 0 0 0 -1 0 0 -1 4 -1 0 0 -1 0 0 0 
    0 0 0 0 0 -1 0 0 -1 4 -1 0 0 -1 0 0 
    0 0 0 0 0 0 -1 0 0 -1 4 -1 0 0 -1 0 
    0 0 0 0 0 0 0 -1 0 0 -1 4 -1 0 0 -1 
    0 0 0 0 0 0 0 0 -1 0 0 -1 4 -1 0 0 
    0 0 0 0 0 0 0 0 0 -1 0 0 -1 4 -1 0 
    0 0 0 0 0 0 0 0 0 0 -1 0 0 -1 4 -1 
    0 0 0 0 0 0 0 0 0 0 0 -1 0 0 -1 4 
+0

Действительно как этот метод. Большое спасибо! –

Смежные вопросы