2012-05-07 3 views
1

У меня есть вектор размера n, который я бы хотел преобразовать в булеву матрицу nxm, где m - количество уникальных значений в этом векторе.Преобразование вектора с повторяющимися значениями в матрицу в Matlab

a = repmat(1:5:20,1,3) 
a = 
    1 6 11 16 1 6 11 16 1 6 11 16 

В результате я хотел бы иметь это матрица 12x4:

1 0 0 0 
0 1 0 0 
0 0 1 0 
... 
0 0 0 1 

Любые идеи, как сделать это без для цикла?

ответ

1

Вы можете попробовать это:

a = repmat(1:5:20,1,3); 
b = unique(a); 

bsxfun(@eq, a', b) 

Результат будет выглядеть так:

ans = 

1  0  0  0 
0  1  0  0 
0  0  1  0 
0  0  0  1 
1  0  0  0 
0  1  0  0 
0  0  1  0 
0  0  0  1 
1  0  0  0 
0  1  0  0 
0  0  1  0 
0  0  0  1 
+0

Не, что в основном '[глаз (4); глаз (4); глаз (4)] '? –

+0

Нет, это не так. Результат просто один и тот же. Замените вторую строку кода на 'b = fliplr (unique (a));' и посмотрите, что результат отличается. –

+0

Отмечено. Продолжать! –

0
a = repmat(1:5:20,1,3) 
b=unique(a); 
c = repmat(a',1,numel(b))== repmat(b,numel(a),1); 

но, в общем, цикл будет быстрее, рекомтировать следует избегать. Итак, теперь с петлей:

a = repmat(1:5:20,1,3) 
b=unique(a); 
c=false(numel(a),numel(b)); 
for ii=1:numel(a) 
    c(ii,:) = a(ii)==b; 
end 
Смежные вопросы