Как я могу создать измененную матрицу идентичности? - PullRequest
0 голосов
/ 20 сентября 2018

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

Чтобы привести простой пример, вот некоторый код, который создает матрицу тождественности в зависимости от значения y:

for i = [1, 2, 4]
  y = i
  x = 5;
  H = eye(y*x)
end

Однако мне нужна не единичная матрица, а первые две строки и все остальные, равные нулю.

Для первого примера код выдает eye(5):

H =

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

Мне нужно что-то, что, учитывая, что y не производит идентичность, но фактически производит:

H =

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

Могу ли я настроить матрицу идентичности, чтобы включить нули только послепервые два ряда?

Ответы [ 3 ]

0 голосов
/ 21 сентября 2018

Вот несколько альтернатив:

  • Использование blkdiag для диагонального объединения единичной матрицы и нулевой матрицы:

    y = 5; x = 2;
    H = blkdiag(eye(x), zeros(y-x));
    
  • Более экзотический подход - использовать поэлементное сравнение с одноэлементным расширением и использовать тот факт, что два NaN не равны друг другу :

    y = 5; x = 2;
    H = [1:x NaN(1,y-x)];
    H = double(bsxfun(@eq, H, H.'))
    
0 голосов
/ 21 сентября 2018

Как предлагается в этом комментарии , вы можете использовать diag:

diag([ones(2,1); zeros(x*y-2,1)])

Это работает, потому что diag делает вектор главной диагональюквадратная матрица, так что вы можете просто передать ей диагональный вектор, который в вашем случае будет 2 1 с, а остальные 0.

Конечно, если вам нужно переменное количество 1 с, в чем я сомневалсяотсюда и комментарий,

n=2;
diag([ones(n,1); zeros(x*y-n,1)])
0 голосов
/ 20 сентября 2018

Я думаю, что самое простое решение состоит в том, чтобы создать матрицу из всех нулей, а затем просто поместить два с помощью линейного индексирования :

H = zeros(x*y);
H([1 x*y+2]) = 1;

Обобщая вышеприведенное, чтобы поставить первый N по диагонали:

H = zeros(x*y);
H(x*y.*(0:(N-1))+(1:N)) = 1;
...