Подтвердить что ты не робот

Создание индикаторной матрицы

Для вектора 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]
4b9b3361

Ответ 1

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

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.

Ответ 2

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

m = max(V);
I = eye(m);
V = I(V, :);

Ответ 3

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

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

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

Ответ 4

Здесь другой подход, похожий на sparse, но с accumarray:

V = [3; 2; 1; 4];
M = accumarray([(1:numel(V)).' V], 1);

Ответ 5

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

M = zeros(numel(V), max(V));
M((1:numel(V))+(V.'-1).*numel(V)) = 1;

Ответ 6

M=sparse(V,1:size(V,1),1)';

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