在matlab中计算矩阵的重复列

时间:2014-11-11 07:58:21

标签: 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

端 更新: 我想要的输出是

1
0  
0 
1

重复2

0 
1 
0 
0 

重复3 零列是1

2 个答案:

答案 0 :(得分:2)

您可以使用unique() - 函数,因为它可以找到唯一的行。因此,您必须转置矩阵A.之后,对unique_ids(来自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

答案 1 :(得分:0)

使用地图数据类型可以很容易地解决这个问题 - 顺便提一下,这也是用于保存结果的非常好的数据结构。可悲的是,在我看来,Matlab并不擅长数据结构。一种解决方案是使用隐藏在Matlab背后的java。但是,您也可以使用内置的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

这会将列表示为char类型,并使用它来计算每个列的数量。 生成的变量map将包含所有信息: map.keys将为您提供A中所有不同列的字符串表示形式的列表,如果您对特定列的数量感兴趣,则可通过以下方式获取该数字:{{1} }(此示例将返回值map('[0;1;0;0]'),因为该类型有3列)。如果您想要从地图中删除只有在您执行以下操作后才会出现的列,您可以轻松地遍历地图中的键:

3

请注意,这不适用于所有类型的矩阵!具有小于15位的整数值的矩阵可以正常工作。但是,如果矩阵的两个不同值由相同的字符串表示(例如keys = map.keys; for i = 1:numel(keys) if map(keys{i}) == 1 map.remove(keys{i}) end end 1000000000000000都表示为1000000000000001),那么您很可能遇到麻烦,这是一个有点复杂,要解决。