2015-03-29 2 views
0

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

[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]

Как это сделать в Октаве? Спасибо!

ответ

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 
1

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

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 
+0

Хороший подход! +1 – beaker

Смежные вопросы