我有一个矩阵,如:
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
答案 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
),那么您很可能遇到麻烦,这是一个有点复杂,要解决。