#matlab #matrix #matrix-indexing
#matlab #матрица #матрица-индексирование
Вопрос:
Учитывая двоичную матрицу M размером n x k, я хотел бы создать векторную метку размером n x 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' ]
Ответ №1:
Вот один из способов сделать это компактно и в векторизованном виде.
[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:
Вот решение, использующее 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'
Ответ №3:
Вы можете использовать функцию find или цикл для построения строк (заменив пустые индексы массива на ‘0’ после завершения).