我有一个MATLAB双数组(通常是3x151,但大小可能会改变),我想检查是否有任何列在它们中具有完全相同的值,顺序相同。
例如,在以下数组中,第1列和第2列是重复的,但第3列则不是。
[ 3 3 2 ;
2 2 2 ;
2 2 3 ]
如果找到重复的列,我想添加少量噪音(可能只添加到其中一列),以确保它们不再重复。
实现这一目标的最有效方法是什么?
答案 0 :(得分:5)
首先,您必须确定重复的列。最有效的方法是使用unique
,它以两种方式提供相反的方式,即唯一行的列表。使用transpose和setdiff来获取重复的列:
M=[ 3 3 2; 2 2 2; 2 2 3];
[~,unique_cols,~]=unique(M.','rows');
duplicate_cols=setdiff(1:size(M,2),unique_cols);
现在识别出重复的列,生成噪音并添加它:
M(:,duplicate_cols)=M(:,duplicate_cols)+rand(size(M,1),numel(duplicate_cols));
如果您想100%确定获取唯一值,请运行代码,直到unique_rows
为空。非常糟糕的运气rand可能重复值,但对于你的小数据集可能永远不会发生。
答案 1 :(得分:1)
您可以使用isequal检查两列是否相等,并添加噪音,例如使用rand。
例如,您可以使用
将每列相互比较s = size(A,2); % Number of columns
for i1 = 1:s-1
for i2 = i1+1:s
if isequal(A(:,i1),A(:,i2))
A(:,i2) = A(:,i2)+rand(size(A(:,i2)))/100;
end
end
end
答案 2 :(得分:1)
根据Daniel的回答,另一个解决方案可能是使用你可以在Matlab Central上找到的抖动(...)函数(见link)
遵循Daniel的识别重复列的过程
M=[ 3 3 2; 2 2 2; 2 2 3];
[~,unique_cols,~]=unique(M.','rows');
duplicate_cols=setdiff(1:size(M,2),unique_cols);
接下来,使用jitter(...)
函数,如下所示:
M(:,duplicate_cols)=jitter(M(:,duplicate_cols))
用于添加预定义的噪音。
可以使用以下选项调整此功能: