Создание вектора метки с использованием матрицы индикаторов в Matlab - PullRequest
3 голосов
/ 27 мая 2011

Учитывая двоичную матрицу M размера nxk , я хотел бы создать вектор Label размера nx 1 такойзапись Метка должна содержать индекс составного столбца M , где ее значения равны 1

, например: если M Матрица задается как

M = [ 0 0 1 1  
      0 0 0 1  
      1 0 0 1
      0 0 0 0
      1 1 1 0 ]

Результирующий Метка Вектор должен быть

 V = [ '34'  
        '4'  
       '14'  
        '0'
      '123' ]

Ответы [ 3 ]

4 голосов
/ 27 мая 2011

Вот один из способов сделать это компактно и векторизованным способом.

[nRows,nCols]=size(M);
colIndex=sprintf('%u',0:nCols);

V=arrayfun(@(x)colIndex(logical([~any(M(x,:)) M(x,:)])),1:nRows,'UniformOutput',false)

V = 

    '34'    '4'    '14'    '0'    '123'
2 голосов
/ 27 мая 2011

Вот решение с использованием FIND и ACCUMARRAY , которое возвращает массивы строк N-на-1:

>> [r,c] = find(M);  %# Find the row and column indices of the ones
>> V = accumarray(r,c,[],@(x) {char(sort(x)+48).'});  %'# Accumulate and convert
                                                       %#   to characters
>> V(cellfun('isempty',V)) = {'0'}  %# Fill empty cells with zeroes

V = 

    '34'
    '4'
    '14'
    '0'
    '123'
1 голос
/ 27 мая 2011

Вы можете использовать функцию или цикл find для построения строк (заменяя пустые индексы массива на '0' после окончания).

...