在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请包含所需的输出…它与建议的问题不完全相同,因为在这个问题中,它明确询问每列有多少次出现。在链接问题中,只询问(并回答)如何查找所有重复的行。