2014-11-11 2 views
0

У меня есть матрица, такие как:Подсчитайте повторяющиеся столбцы матрицы в MATLAB

A= 
    1 0 0 1 1 0 0 
    0 0 1 0 0 1 1 
    0 0 0 0 0 0 0 
    1 0 0 0 1 0 0 

Теперь я хочу, чтобы вычислить количество повторяющихся столбцов. Например, мой дубликат столбца

1 
0 
0 
1 

с количеством дубликатов 2. А другой мой дубликат столбца

0 
1 
0 
0 

с номером дубликата 3 Кроме того, я также хочу, чтобы вычислить количество нулевой колонке. В моем случае есть 1 столбец, который имеет значение 0 для всех элементов (2-й столбец) Я бы хотел, чтобы вы Matlab решили мою проблему. Пожалуйста, помогите мне сделать это. Это мой код matlab. Тем не менее, я не работает отлично

numcol=0; 
n=100;% the number of columns 
for i=1:n 
    for j=(i+1):n 
    if(nnz(A(:,i)-A(:,j))==0) % A is matrix kxn 
     numcol=numcol+1; 
    end 

end 
    if(nnz(A(:,i))==0) 
     countzeros=countzeros+1; 
    end 

конец Update: Мой вывод, который я хочу это

1 
0 
0 
1 

с повторяющимися 2

0 
1 
0 
0 

с повторяющимися 3 нулевой столбца 1

+0

Вы можете просто сделать 'isequal (A (:, 1), A (:, i))' в вашем цикле for. В этом случае цикл for должен быть 'для i = 2: n', и если isequal оценивается как истинный, увеличьте счетчик. – ha9u63ar

+0

@ user8264, пожалуйста, укажите желаемый результат, который вы хотите ... – Dan

+0

Это не совсем дубликат предлагаемого вопроса, так как в этом вопросе явно задано * сколько * случаев в каждом столбце. В связанном вопросе только спрашивают (и отвечают), как найти строки, у которых есть все дубликаты. – Nras

ответ

2

Для этого вы можете использовать функцию unique(), так как она может содержать уникальные строки. Поэтому вам нужно транспонировать вашу матрицу A. После этого простой подсчет уникальных_ид (3-я выходная переменная от unique()) дает вам желаемый результат.

A=[1 0 0 1 1 0 0 
    0 0 1 0 0 1 1 
    0 0 0 0 0 0 0 
    1 0 0 0 1 0 0]; 

A = transpose(A); % // transpose to be able to find unique rows (not cols) 
[A_unique,~,u_id] = unique(A, 'rows'); % // find unique rows and their unique id 

occurrences = histc(u_id, unique(u_id)); % // count occurrences of unique ids 

% // visualize result: unique columns, last row: number of occurrences 
[transpose(A_unique); transpose(occurrences)] 

Это делает печать:

ans = 

    0  0  1  1 
    0  1  0  0 
    0  0  0  0 
    0  0  0  1 
    1  3  1  2 

который должен быть прочитан по столбцам, как, где первые 4 строк описывают исходный столбец и последнюю строку описывает количество вхождений:

% // column [0;0;0;0]: 1 occurrence 
% // column [0;1;0;0]: 3 occurrences 
0

Эта проблема легко решаются с использованием типа данных карты, что, кстати, также очень хорошая структура данных для хранения результата. К сожалению, Matlab, по моему мнению, не очень хорош в структурах данных. Одним из решений является использование Java, скрытого за Matlab. Однако вы можете использовать встроенные функции Matlab. Один быстрого писать, но довольно грубо, решения:

A = [1,0,0,1,1,0,0;0,0,1,0,0,1,1;0,0,0,0,0,0,0;1,0,0,0,1,0,0]; 

map = containers.Map('KeyType','char','ValueType','double'); 
for i = 1:size(A,2) 
    key = mat2str(A(:,i)); 
    if map.isKey(key) 
     map(key) = map(key)+1; 
    else 
     map(key) = 1; 
    end 
end 

Это будет представлять столбцы как полукокс типа и использовать, чтобы подсчитать, сколько из каждого столбца есть. Результирующая переменная map будет содержать всю информацию: map.keys предоставит вам список строковых представлений всех разных столбцов в A, и если вас интересует, сколько из них имеет конкретный столбец, вы получаете это число: map('[0;1;0;0]') (этот пример вернет значение 3, так как есть 3 столбца этого типа). И вы можете легко перебирает ключи в карте, если вы, например, хотите, чтобы удалить столбцы из карты, которые происходят только один раз вы можете сделать что-то вроде:

keys = map.keys; 
for i = 1:numel(keys) 
    if map(keys{i}) == 1 
     map.remove(keys{i}) 
    end 
end 

Обратите внимание, однако это не будет работать для всех видов матрицы! Матрицы с целыми значениями с менее чем 15 цифрами сделают все возможное. Однако, если два разных значения матрицы представлены одной и той же строкой (например, 1000000000000000 и 1000000000000001 представлены как '1e+15'), тогда у вас могут возникнуть проблемы, которые немного сложнее решить.

Смежные вопросы