2016-06-02 2 views
1

Предположим, что у меня есть:Найти положение равных элементов в матрице с использованием Matlab

m = [1,2,3;1,4,5;6,4,7] 

Я хочу, чтобы получить список, содержащий положения элементов в матрице m так, что позиции равных элементов сгруппированных вместе. Выход для матрицы m должны быть:

{{1,1},{2,1}},{{2,2},{3,2}},{1,2},{1,3},{2,3},{3,1},{3,3} 
%  1    2   3  4  5  6  7 

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

+0

Помог ли кто-нибудь из наших ответов? – rayryeng

ответ

3

Простейшим способом было бы перебрать каждое уникальное значение и определить позиции строк и столбцов, соответствующие каждому значению. Нечто подобное может работать:

val = unique(m); 
pos = cell(1, numel(val)); 
for ii = 1 : numel(val) 
    [r,c] = find(m == val(ii)); 
    pos{ii} = [r,c]; 
end 

pos будет массив ячеек, содержащий все позиции для каждого уникального значения. Мы можем показать, что эти позиции по:

>> format compact; celldisp(pos) 
pos{1} = 
    1  1 
    2  1 
pos{2} = 
    1  2 
pos{3} = 
    1  3 
pos{4} = 
    2  2 
    3  2 
pos{5} = 
    2  3 
pos{6} = 
    3  1 
pos{7} = 
    3  3 

Это, конечно, не имеет смысла, если вы специально не показывают каждое уникальное значение для каждой группы позиций. Таким образом, мы можем попробовать что-то вроде этого вместо того, чтобы, когда мы можем перебрать каждый элемент в массиве ячеек, а также отображать соответствующий элемент, каждый набор позиций принадлежит:

for ii = 1 : numel(val) 
    fprintf('Value: %f\n', val(ii)); 
    fprintf('Positions:\n'); 
    disp(pos{ii}); 
end 

Что я получаю сейчас:

Value: 1.000000 
Positions: 
    1  1 
    2  1 
Value: 2.000000 
Positions: 
    1  2 
Value: 3.000000 
Positions: 
    1  3 
Value: 4.000000 
Positions: 
    2  2 
    3  2 
Value: 5.000000 
Positions: 
    2  3 
Value: 6.000000 
Positions: 
    3  1 
Value: 7.000000 
Positions: 
    3  3 
1

Это дает вам то, что вы хотите, за исключением того, что индексы уникальных элементов также завернутые в ячейке дважды, так же, как индексы повторяющихся элементов, за исключением:

m = [1,2,3;1,4,5;6,4,7]; 

[~, idx] = ismember(m(:), unique(m(:))); 
linInd = 1:numel(m); 
[i,j] = ind2sub(size(m), linInd); 
res = accumarray(idx, linInd, [], @(x) {num2cell([i(x);j(x)]',2)}); 

Результат:

>> celldisp(res) 

res{1}{1} = 
    2  1 
res{1}{2} = 
    1  1 
res{2}{1} = 
    1  2 
res{3}{1} = 
    1  3 
res{4}{1} = 
    2  2 
res{4}{2} = 
    3  2 
res{5}{1} = 
    2  3 
res{6}{1} = 
    3  1 
res{7}{1} = 
    3  3 
Смежные вопросы