在matlab中计算矩阵的重复列

在matlab中计算矩阵的重复列,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 现在我想计算重复列的数量。例如,我的重复列是 1 0 0 1 重复次数为2次。我的另一个重复列是 0 1 0 0 重复次数为3次 此外,我还想计算零列的数目。在我的例子中,有1列,所有元素的值为0(第2列) 我希望你能解决我的问题。请帮我做这件事。这是我的matlab代码。然而,我的工作并不完美 numcol=0; n=

我有一个矩阵,例如:

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代码。然而,我的工作并不完美

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

使用地图数据类型很容易解决此问题,顺便说一句,这也是保存结果的非常好的数据结构。不幸的是,在我看来,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
中所有不同列的字符串表示形式列表,如果您对特定列的数量感兴趣,可以通过以下方式获得该数字:
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位的矩阵就可以了。但是,如果矩阵的两个不同值由同一个字符串表示(例如,
10000000000000
10000000000001
都表示为
'1e+15'
),那么您很可能会遇到麻烦,这是一个比较复杂的问题。

您可以使用
unique()
-函数来解决这个问题,因为它可以找到唯一的行。因此,您必须转置矩阵A。然后,对唯一ID(来自
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

您只需在for循环中执行
isequal(A(:,1),A(:,i))
。在这种情况下,对于i=2:n,for循环应该是
,如果isequal的计算结果为true,则递增计数器。@user8264请包含所需的输出…它与建议的问题不完全相同,因为在这个问题中,它明确询问每列有多少次出现。在链接问题中,只询问(并回答)如何查找所有重复的行。