2015-11-17 3 views
0

Я пытаюсь создать матрицу (32 x 32) с -1 на ее главной диагонали и 1 в ее первой и второй супердиагоналях. 0 всюду.Как создать эту матрицу на Matlab?

A = eye(32)* -1; 

Это дает мне матрицу с -1 по ее основной диагонали, как мне продолжить?

+0

Умм ... На мгновение я увидел «принять» галочка появится рядом с моим ответом, но прежде чем я случайно щелкнул по нему, затем он исчез. Вы согласились - не принимайте мой ответ? Вы просто приняли его, и в системе появилась большая ошибка? Я не пытаюсь быть нуждающимся, я просто удивлен тем, что видел :) –

+0

@AndrasDeak Accept теперь вернулся. Хорошая работа! – rayryeng

+0

Спасибо @rayryeng, но мой вопрос все еще стоит. Это странная (и опасная) ошибка, или darkkkk7 удалили себя? –

ответ

7
n=32; 
toeplitz([-1; zeros(n-1,1)],[-1 1 1 zeros(1,n-3)]) 

- вот что вам нужно. Это создаст несимметричную матрицу Тёплица (полосовую матрицу), первая колонка которой задается [-1; zeros(32-1,1)], первая строка - [-1 1 1 zeros(1,32-3)]. Вы также можете определить функцию с размером n в качестве входного параметра, если это необходимо.

2
N = 32; 
A = -diag(ones(N,1)); % diagonal 
tmp1=diag(ones(N-1,1),1); %1st supra 
tmp1=diag(ones(N-2,1),2); @2nd supra 
A = A+tmp1+tmp2; 

использованием diag

+2

Это не дает описанный вывод. – Daniel

5
n = 32 
A = -1*eye(n); %Create 32x32 Identity 
A(n+1:n+1:n^2) = 1; %Set 1st Superdiagonal to 1 
A(2*n+1:n+1:n^2) = 1; %Set 2nd Superdiagonal to 1 

Обратите внимание, что MATLAB использует column-major order для матриц. Для первого супердиагонального мы начинаем с (n + 1) -го элемента и выбираем каждый (n + 1) -й элемент на нем. Мы выполняем аналогичную операцию для 2-го сверхдиагонального, за исключением того, что мы начинаем с (2 * n + 1) -го элемента.

+2

Поскольку матрица квадратная, может иметь смысл (и, возможно, быть немного быстрее) использовать «A (n + 1: n + 1: end) = 1;» и «A (2 * n + 1: n + 1 : end) = 1; '. Я бы не удивился, если бы этот ответ был самым быстрым во многих случаях. – horchler

6

Вы можете использовать spdiags, чтобы установить диагонали непосредственно в разреженную матрицу и full -it при желании.

n  = 32; 
Asparse = spdiags(ones(n,1)*[-1,1,1],[0,1,2],n,n); 
Afull = full(Asparse); 
5

Только с помощью diag и eye:

n = 32; 
z = ones(n-1,1); 
A = diag(z,1)+diag(z(1:n-2),2)-eye(n); 

Там также:

n = 32; 
A = gallery('triw',n,1,2)-2*eye(n) 

с помощью функции gallery с опцией 'triw'.

+0

Почему это проголосовало? – horchler

+0

Это не верхняя диагональная матрица, а не тридиагональная. –

+0

Неправильный дайгон, вопрос задан для 1 и 2, а не -1 и 1. Но я не спустил вниз. – Daniel

4

diag позволяет создать матрицу, проходящую по диагонали:

-diag(ones(n,1),0)+diag(ones(n-1,1),1)+diag(ones(n-2,1),2) 

Последний параметр 0 для главной диагонали, 1 и 2 для супер диагоналей.

3

Если я могу предложить более эзотерический код, сначала создайте вектор, полный 1s, затем создайте единицу матрицы, затем смените диагональную матрицу с этими 1 с вектором и сдвиньте ее вправо на 1, уменьшив сумму элементов в векторе, то сделайте это снова для последней сверхдиагональной.

n = 32; 
vec = ones(n,1); 
out = -eye(n) + diag(vec(1:end-1),1) + diag(vec(1:end-2),2); 
2

Еще один подход: это использует convmtx от обработки сигналов Toolbox:

n = 32; %// matrix size 
v = [-1 1 1]; %// vector with values 
M = convmtx(v, n); 
M = M(:,1:end-numel(v)+1); 
Смежные вопросы