2013-04-02 6 views
2

Мой вопрос: как я могу создать матрицу того же типа в программе matlab, чтобы она сохраняла ту же логику, которая составляет 10 с в главной диагонали, а затем 3s в верхней и нижней диагонали основной диагональю и диагоналями выше и ниже 3s и 0s в других случаях и что я могу модифицировать для любого NxN, который мне нужен?Создание конкретной большой матрицы в matlab

что-то подобное для случая 6x6

A = [10 3 1 0 0 0 ; 
     3 10 3 1 0 0 ; 
     1 3 10 3 1 0 ; 
     0 1 3 10 3 1 ; 
     0 0 1 3 10 3 ; 
     0 0 0 1 3 10 ]; 
+1

Вы что-нибудь пробовали? Может быть, посмотрите здесь: http://stackoverflow.com/questions/3963565/how-to-assign-values-on-the-diagonal – gzm0

ответ

3

Для очень больших матриц (N = 10000), вы должны будете используйте разреженную матрицу.
Рассмотрим следующую конструкцию с помощью spdiags

function A = largeSparseMatrix(N) 
% 
% construct NxN sparse matrix with 10 on main diagonal, 
% 3 on the first off-diagonals and 1 on the second off-diagonals 
% 
B = ones(N, 5); % pre-allocate for diagonals 
B(:,1) = 10; % main diagonal d(1) = 0 
B(:,2:3) = 3; % first off diagonal 
B(:,4:5) = 1; % second off-diagonal 
d = [ 0 , 1, -1, 2, -2 ]; % mapping columns of B to diagonals of A 
A = spdiags(B, d, N, N); % TA-DA! 

Обратите внимание, что некоторые из записей в B игнорируются в строительстве A.
Для получения дополнительной информации см. manual от spdiags.

+1

+1, вот как это сделать. – bla

+0

@natan -thanks! – Shai

+0

Когда я выполняю программу и увеличиваю N, чтобы сказать 20, я не могу получить матрицу 20x20 с 10 на главной диагонали, 3 на первых внедиагоналях и 1 на вторых внедиагоналях, что я делаю неправильно ? – mpalmero

3

Код:

toeplitz([10 3 1 0 0 0]) 

Выход:

ans = 

    10  3  1  0  0  0 
    3 10  3  1  0  0 
    1  3 10  3  1  0 
    0  1  3 10  3  1 
    0  0  1  3 10  3 
    0  0  0  1  3 10 
+0

Огромное спасибо, но что, если хотите сделать это сначала 50x50 и 1000x1000 и возможно, тогда 10000x10000 – mpalmero

+2

@mpalmero. Честно говоря, вы даже не должны формировать топлиц, потому что это пустая трата памяти; это также будет пустой тратой флопов, чтобы делать арифметику непосредственно с матрицей. Вы можете сохранить примерную матрицу выше всего за 3 элемента. Но, если вы хотите провести реформу в явном виде, самым простым способом было бы просто повторно использовать функцию «toeplitz» и снова перезаписать «A». Также не забудьте принять мой ответ, если он ответит на ваш вопрос. – Justin

+0

@jucestain - то, что ему действительно нужно, - это разреженная матрица ... – Shai