Создание матрицы индикаторов - PullRequest
23 голосов
/ 27 мая 2011

Для вектора V размера nx 1 я хотел бы создать матрицу двоичного индикатора M размера nx Max (V) так, что записи строки M имеют 1 в индексе соответствующих столбцов, 0 в противном случае.

Например: если V равно

V = [ 3
      2
      1
      4]

Матрица индикатора должна быть

M= [ 0 0 1 0
     0 1 0 0
     1 0 0 0
     0 0 0 1]

Ответы [ 6 ]

29 голосов
/ 27 мая 2011

Что касается матрицы индикаторов, то лучше, если вы сделаете ее разреженной. Вы почти всегда будете делать умножение матрицы на нее, так что делайте это умножение эффективным.

n = 4;
V = [3;2;1;4];
M = sparse(V,1:n,1,n,n);
M =
   (3,1)        1
   (2,2)        1
   (1,3)        1
   (4,4)        1

Если вы настаиваете на том, чтобы M была полной матрицей, то сделать это так просто после использования полной.

full(M)
ans =
     0     0     1     0
     0     1     0     0
     1     0     0     0
     0     0     0     1

Узнайте, как использовать разреженные матрицы. Вы получите большую выгоду от этого. По общему признанию, для матрицы 4x4 разреженность не сильно выиграет. Но примеры случаев никогда не являются вашей настоящей проблемой. Предположим, что n было действительно 2000?

n = 2000;
V = randperm(n);
M = sparse(V,1:n,1,n,n);
FM = full(M);

whos FM M
  Name         Size                 Bytes  Class     Attributes

  FM        2000x2000            32000000  double              
  M         2000x2000               48008  double    sparse    

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

A = magic(2000);

tic,B = A*M;toc
Elapsed time is 0.012803 seconds.

tic,B = A*FM;toc
Elapsed time is 0.560671 seconds.
7 голосов
/ 09 марта 2015

быстрый способ сделать это - если вам не требуется разреженная матрица - это создать идентификационную матрицу размером не менее max (v), а затем создать матрицу индикаторов, извлекая индексы из v:

m = max(V);
I = eye(m);
V = I(V, :);
1 голос
/ 17 января 2018

Вы можете просто объединить индекс столбца в V с индексом строки, чтобы создать линейный индекс , а затем использовать его для заполнения M (инициализируется нулями):

M = zeros(numel(V), max(V));
M((1:numel(V))+(V.'-1).*numel(V)) = 1;
1 голос
/ 29 июня 2015

Вот другой подход, похожий на sparse, но с accumarray:

V = [3; 2; 1; 4];
M = accumarray([(1:numel(V)).' V], 1);
1 голос
/ 22 августа 2012

Вы хотели бы создать матрицу индексов, которая будет разреженной ради памяти.Это так же просто, как:

vSize = size(V);
Index = sparse(vSize(1),max(V));
for i = 1:vSize(1)
    Index(i, v(i)) = 1;
end

Я сам использовал это, наслаждайтесь:)

0 голосов
/ 08 марта 2015
M=sparse(V,1:size(V,1),1)';

создаст разреженную матрицу, которую можно использовать в расчетах в качестве полной версии. Вы можете использовать full (M), чтобы «накачать» M, чтобы фактически хранить нули.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...