MATLAB:检查相同的列,并添加噪声使它们不相同

时间:2016-01-19 10:21:02

标签: matlab

我有一个MATLAB双数组(通常是3x151,但大小可能会改变),我想检查是否有任何列在它们中具有完全相同的值,顺序相同。

例如,在以下数组中,第1列和第2列是重复的,但第3列则不是。

[ 3    3    2 ; 
  2    2    2 ;
  2    2    3 ]

如果找到重复的列,我想添加少量噪音(可能只添加到其中一列),以确保它们不再重复。

实现这一目标的最有效方法是什么?

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))

用于添加预定义的噪音。

可以使用以下选项调整此功能:

  1. factor,
  2. uniformOrGaussianFlag,
  3. smallOrRangeFlag,
  4. realOrIm