Я пытаюсь создать матрицу (32 x 32) с -1 на ее главной диагонали и 1 в ее первой и второй супердиагоналях. 0 всюду.Как создать эту матрицу на Matlab?
A = eye(32)* -1;
Это дает мне матрицу с -1 по ее основной диагонали, как мне продолжить?
Я пытаюсь создать матрицу (32 x 32) с -1 на ее главной диагонали и 1 в ее первой и второй супердиагоналях. 0 всюду.Как создать эту матрицу на Matlab?
A = eye(32)* -1;
Это дает мне матрицу с -1 по ее основной диагонали, как мне продолжить?
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
в качестве входного параметра, если это необходимо.
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) -го элемента.
Поскольку матрица квадратная, может иметь смысл (и, возможно, быть немного быстрее) использовать «A (n + 1: n + 1: end) = 1;» и «A (2 * n + 1: n + 1 : end) = 1; '. Я бы не удивился, если бы этот ответ был самым быстрым во многих случаях. – horchler
Вы можете использовать spdiags
, чтобы установить диагонали непосредственно в разреженную матрицу и full
-it при желании.
n = 32;
Asparse = spdiags(ones(n,1)*[-1,1,1],[0,1,2],n,n);
Afull = full(Asparse);
Только с помощью 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)
diag
позволяет создать матрицу, проходящую по диагонали:
-diag(ones(n,1),0)+diag(ones(n-1,1),1)+diag(ones(n-2,1),2)
Последний параметр 0 для главной диагонали, 1 и 2 для супер диагоналей.
Если я могу предложить более эзотерический код, сначала создайте вектор, полный 1s, затем создайте единицу матрицы, затем смените диагональную матрицу с этими 1 с вектором и сдвиньте ее вправо на 1, уменьшив сумму элементов в векторе, то сделайте это снова для последней сверхдиагональной.
n = 32;
vec = ones(n,1);
out = -eye(n) + diag(vec(1:end-1),1) + diag(vec(1:end-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);
Умм ... На мгновение я увидел «принять» галочка появится рядом с моим ответом, но прежде чем я случайно щелкнул по нему, затем он исчез. Вы согласились - не принимайте мой ответ? Вы просто приняли его, и в системе появилась большая ошибка? Я не пытаюсь быть нуждающимся, я просто удивлен тем, что видел :) –
@AndrasDeak Accept теперь вернулся. Хорошая работа! – rayryeng
Спасибо @rayryeng, но мой вопрос все еще стоит. Это странная (и опасная) ошибка, или darkkkk7 удалили себя? –