Создание индивидуальной матрицы на основе матрицы меток из DataMatrix - PullRequest
0 голосов
/ 13 июня 2011

Пусть label - матрица размера N x 1 (тип double) и data - матрица размера N x M (тип double). Записи в матрице Label выглядят как [1; 23; 135; ....; 6] , который передает, что

Первая строка в матрице data принадлежит метке 1
Вторая строка в матрице data принадлежит метке 2 и метке 3
Третий ряд в матрице data принадлежит метке 1, метке 3 и метке 5 и т. Д.

Я хотел бы создать массив ячеек, скажем Individual {i} , в котором хранятся все эти строки из матрицы data , которая принадлежит метке i , как указано по метке * матрица 1032 *.

Результирующая Индивидуальная {i} матрица будет иметь размер N_i x M .

Есть ли какой-нибудь эффективный способ сделать это, вместо того, чтобы зацикливать строку за строкой data и label matrix?

Ответы [ 2 ]

1 голос
/ 14 июня 2011

Учитывая правильные переменные: N, M, data, label, как вы описали, вот пример кода, который создает желаемый массив ячеек Individual:

%# convert labels to binary-encoded format (as suggested by @Tom)
maxLabels = 9;                            %# maximum label number possible
L = false(N,maxLabels);
for i=1:N
    %# extract digits of label
    digits = sscanf(num2str(label(i)),'%1d');

    %# all digits should be valid label indices
    %assert( all(digits>=1) && all(digits<=maxLabels) );

    %# mark this row as belong to designated labels
    L(i,digits) = true;
end

%# distribute data rows according to labels
individual = cell(maxLabels,1);
for i=1:maxLabels
    individual{i} = data(L(:,i),:);
end
1 голос
/ 13 июня 2011

Я бы превратил вашу матрицу label в булеву матрицу L:

L = [ 1 0 0 0 0 0 ;
      0 1 1 0 0 0 ;
      1 0 1 0 1 0 ;
    ...
      0 0 0 0 0 1 ];

для вашего примера.Вы можете использовать разреженную матрицу, если N или число меток очень велико.

Тогда я думаю, что то, что вы называете N_i, равно sum(L(:, i)), а L' * data вычислит сумму всех строк в data с меткой L.

Что вы хотите сделать с data, как только он достигнет ячейки Individual?Почти наверняка есть лучший способ сделать это ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...