2016-01-31 7 views
3

Я хочу преобразовать целое число i в логический вектор с i-м ненулевым элементом. Это может де сделано с 1:10 == 2, который возвращаетПреобразование целого числа в логический массив в MATLAB

0  1  0  0  0  0  0  0  0  0 

Теперь я хочу, чтобы этот процесс векторизации для каждой строки. Написание repmat(1:10, 2, 1) == [2 5]' Я ожидаю получить

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

Но вместо этого, возникает эта ошибка:

Ошибка использования ==
размеры матрицы должны быть согласованы.

Могу ли я оцифровать этот процесс, или это только цикл for?

+0

@ johnny5 Это не так, но это очень плохо, сформированы и неясны. Ответ на стакан ниже поясняет, чего хочет OP, и это даже по теме. –

+0

В целом, будьте осторожны, ожидая, что 1s и 0s будут считаться логическими. Рассмотрим: '>> foo = 1:10; >> foo ([1,0,1,0,1,0,1,0,1,0]) Индексы индексов должны быть либо натуральными целыми положительными, либо логическими. >> foo (логический ([1,0,1,0,1,0,1,0,1,0])) ans = 1 3 5 7 9' –

ответ

9

Вы можете использовать bsxfun:

>> bsxfun(@eq, 1:10, [2 5].') 
ans = 

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

Обратите внимание на транспонирования .' на втором векторе; это важно.

+0

Значок менталиста, +1;) –

+2

@ AndrasDeak Я работал с моим тренером по джедаям. – beaker

+0

Для людей, использующих октаву, [трансляция] (https://www.gnu.org/software/octave/doc/interpreter/Broadcasting.html) позволяет писать просто '(1:10) == [2 5]. ' ' – ederag

4

Другой способ заключается в использовании eye и создать логическую матрицу, n x n долго, а затем использовать индексы для индексации в ряды этой матрицы:

n = 10; 
ind = [2 5]; 

E = eye(n,n) == 1; 
out = E(ind, :); 

Получаем:

>> out 

out = 

    0  1  0  0  0  0  0  0  0  0 
    0  0  0  0  1  0  0  0  0  0 
2

Еще одна возможность с использованием индексации:

n = 10; 
ind = [2 5]; 
x=zeros(numel(ind),n); 
x(sub2ind([numel(ind),n],1:numel(ind),ind))=1;