Построить матрицу в октаве

У меня есть вектор idx = [3; 5; 3; 4; 3; 2; 5; 1]. Число от 1:k с k = 5. Я хочу сделать матрицу A "k by m" (m - количество элементов в векторе idx). Каждая строка A содержит либо "0", либо "1", где "1" указывается индексом вектора idx. Например, третья строка A (k = 3) - это "1" в столбцах 1, 3, 5, потому что это индексы "3" в idx. Так что А =

[0 0 0 0 0 0 0 1; 0 0 0 0 1 0 0 0; 1 0 1 0 1 0 0 0; 0 0 0 1 0 0 0 0; 0 1 0 0 0 0 1 0]

Как я могу сделать это в Octave? Спасибо!

2 ответа

Или другим способом:

idx = [3; 5; 3; 4; 3; 2; 5; 1];
A = sparse (idx, [1:numel(idx)], 1)
A =   Compressed Column Sparse (rows = 5, cols = 8, nnz = 8 [20%])
(3, 1) ->  1
(5, 2) ->  1
(3, 3) ->  1
(4, 4) ->  1
(3, 5) ->  1
(2, 6) ->  1
(5, 7) ->  1
(1, 8) ->  1

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

B = full (A)
B =

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

Попробуй это:

idx = [3; 5; 3; 4; 3; 2; 5; 1];
n = numel(idx);
k = 5;
A=zeros(k,n);

A(sub2ind(size(A), idx, [1:n]')) = 1

Выход:

A =

   0   0   0   0   0   0   0   1
   0   0   0   0   0   1   0   0
   1   0   1   0   1   0   0   0
   0   0   0   1   0   0   0   0
   0   1   0   0   0   0   1   0
Другие вопросы по тегам