2014-12-17 7 views
0

Мне нужно создать трехдиагональную матрицу блока в Scilab. Точнее я хотел бы создать M^2 & times; M^2 матрица формата:Matlab/Scilab/R: Создание блочной трехдиагональной матрицы в Scilab

B C 0 ... 0 0 
    D B C 0 ... 0 
    0 D B C ... 0 
    0 ... ... ... ... 
    0 0 ... D B C 
    0 0 0 ... D B 

, где В, С и D являются матрицами М х М.

Я знаю, как создать диагональную матрицу блока с помощью функции «sysdiag», но я не нашел ссылки для простого создания трехдиагонального блока.

Кстати, учитывая матрицы B, C и D, я знаю, как создать матрицу выше.

auxA = sysdiag(B,B); 
    auxC = C; 
    auxD = D; 
    for i=1:2*M-1 
    auxA = sysdiag(auxA,B); 
    auxC = sysdiag(auxC,C); 
    auxD = sysdiag(auxD,D); 
    end 
    A = auxA + [zeros((2*M+1)^2 -(2*M+1),2*M+1) auxC ;zeros(2*M+1,2*M+1) zeros(2*M+1,(2*M+1)^2 -(2*M+1)) ] + [zeros(2*M+1,(2*M+1)^2 -(2*M+1)) zeros(2*M+1,2*M+1); auxD zeros((2*M+1)^2 -(2*M+1),2*M+1)]; 

Я все еще хотел бы knwo, если есть функция, которая делает это непосредственно в Scilab, Matlab или R. Может кто-нибудь помочь мне с этим, пожалуйста?

Все советы приветствуются.

Большое спасибо

+0

Не похоже, что есть. Единственная полезность, которую я знаю, порождает тридиагональную матрицу, но не с элементами, являющимися матрицами ... только скалярами. Однако это обращение к MATLAB FEX Джоном Д'Эрико представляет особый интерес: http://www.mathworks.com/matlabcentral/fileexchange/10603--block--tri-diagonal-matrices – rayryeng

ответ

0

Kronecker product, реализованный в виде .*. в Scilab, может помочь. Учитывая M, B, C, D, как в вашем посте, произведение Кронекера с единичной матрицей создает блочно-диагональную матрицу, как то, что вы получите с sysdiag:

eye(M,M).*.B 

Но продукт Кронекера также могут быть приняты с другими матрицы. Поместите 1s выше главной диагонали, и принимать продукт Кронекера с C, чтобы получить блоки C в нужных местах:

diag(ones(M-1,1),1).*.C 

Аналогично для D:

diag(ones(M-1,1),-1).*.D 

В одной строке,

A = eye(M,M).*.B + diag(ones(M-1,1),1).*.C + diag(ones(M-1,1),-1).*.D 

выполняет эту работу.

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