2016-05-14 4 views
0

Я пишу код Matlab для решения нелинейных уравнений с частными производными. Я достиг точки, в которой мне нужна блок-матрица (M + 1)^2 по (M + 1)^2, содержащая A в качестве основной диагонали, B в позиции (i, i + 1), а C в (i, i + 2). то есть B и C находятся над главной диагональю A. Существует ли короткий способ построения таких матриц блоков?Создание блочной тридиагональной матрицы в matlab

ответ

1

Начнем с того, вы можете создать единый блок, используя triu функцию, как это:

M = 4; 
A = 2; B = 3; C = 4; 
onesMat = ones(M+1,M+1); 
block = A*eye(M+1) + B*(triu(onesMat,1)-triu(onesMat,2)) + C*(triu(onesMat,2)-triu(onesMat,3)); 

block = 
    2  3  4  0  0 
    0  2  3  4  0 
    0  0  2  3  4 
    0  0  0  2  3 
    0  0  0  0  2 

Если я правильно понимаю, и вы хотите создать блочно-диагональную матрицу, повторяя тот же блок M+1 раз, вы можете использовать blkdiag для этого:

blocks = repmat({block}, M+1, 1); 
res = blkdiag(blocks{:}); 
+0

это то, что я получаю после запуска ваших кодов: [5x5 двойного] [5x5 двойного] [5x5 двойного] [5x5 double] [5x5 double] – YYG

+0

Не уверен, что вы имеете в виду. 'res', результат' blkdiag', является блок-диагональной матрицей 25x25. Если вы имеете в виду, что 'blocks' - это массив ячеек матриц' M + 1' - да, конечно. Нам нужно, чтобы они объединялись в одну блочно-диагональную матрицу, используя 'blkdiag'. –

+0

Хорошо, если я понимаю вас, вы имеете в виду, что матрица блоков сформирована, только она не отображается? – YYG

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