2016-03-23 3 views
3

Я хотел бы создать квадратную матрицу размером n x n, где диагональные элементы и левая диагональ равны 1. Остальная часть элементы равны 0.Создайте матрицу с диагональю и левой диагональю всех 1s в MATLAB

к примеру, это будет ожидаемый результат, если матрица была 5 х 5:

1 0 0 0 0 
1 1 0 0 0 
0 1 1 0 0 
0 0 1 1 0 
0 0 0 1 1 

Как я мог бы сделать это в MATLAB?

+0

Использование [ 'diag'] (http://www.mathworks.com/ help/matlab/ref/diag.html) дважды, добавьте их вместе. – excaza

+0

Всегда только две диагонали '1' s? – Dan

+0

@ Дана да всегда с одними – efirvida

ответ

6

Trivial используя tril функцию:

tril(ones(n),0) - tril(ones(n),-2) 

И если вы хотите более толстую линию 1 с просто настроить, что -2:

n = 10; 
m = 4; 
tril(ones(n),0) - tril(ones(n),-m) 

Если вы предпочитаете использовать diag как excaza предложил тогда попробовать

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

, но вы не можете контролировать «толщину» полоски таким образом. Однако для толщины 2 он может работать лучше. Тебе пришлось бы это проверить.

5

Вы также можете использовать spdiags также для создания этой матрицы:

n = 5; 
v = ones(n,1); 
d = full(spdiags([v v], [-1 0], n, n)); 

Получаем:

>> d 

d = 

    1  0  0  0  0 
    1  1  0  0  0 
    0  1  1  0  0 
    0  0  1  1  0 
    0  0  0  1  1 

Первые две строки определяют требуемый размер матрицы, предполагая, что квадрат n x n, а также как вектор всех тех, что имеет длину n x 1. Затем мы вызываем spdiags, чтобы определить, где по диагонали этой матрицы этот вектор будет заселен. Мы хотим определить основную диагональ, чтобы иметь все, а также диагональ слева от главной диагонали, или -1 вдали от основной диагонали. spdiags отрегулирует общее количество элементов для диагонали вдали от основного для компенсации.

Мы также гарантируем, что выход имеет размер n x n, но эта матрица фактически sparse. . Нам нужно преобразовать матрицу full завершить результат,

5

С небольшим количеством индексов жонглирование, вы также можете сделать это:

N = 5; 
ind = repelem(1:N, 2); % [1 1 2 2 3 3 ... N N] 
M = full(sparse(ind(2:end), ind(1:end-1), 1)) 
+0

Хорошее злоупотребление 'редким': D. +1. – rayryeng

5

Простой подход с использованием linear indexing:

n = 5; 
M = eye(n); 
M(2:n+1:end) = 1; 
+0

Ха! Очень хорошо. BTW приветствуется :) – rayryeng

+1

Спасибо. Я всегда рядом. :) –

3

Это также можно сделать с помощью bsxfun:

n = 5;  %// matrix size 
d = [0 -1]; %// diagonals you want set to 1 
M = double(ismember(bsxfun(@minus, 1:n, (1:n).'), d)); 

Для Например, чтобы получить матрицу 5x5 с главной диагонали и двух диагоналей ниже набора к 1, определить n=5 и d = [0 -1 -2], что дает

M = 
    1  0  0  0  0 
    1  1  0  0  0 
    1  1  1  0  0 
    0  1  1  1  0 
    0  0  1  1  1 
Смежные вопросы