Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Matlab中找到重复值的索引并替换它们的索引_Matlab_Replace_Duplicates_Find_Identify - Fatal编程技术网

在Matlab中找到重复值的索引并替换它们的索引

在Matlab中找到重复值的索引并替换它们的索引,matlab,replace,duplicates,find,identify,Matlab,Replace,Duplicates,Find,Identify,我有一个矩阵B 1631x5 第2列和第3列分别表示X和Y坐标 我想确定B(I+k,2)==B(I+j,2)&B(I+k,3)==B(I+j,3)的索引。请注意,可以有多个副本 以下是识别重复项的脚本: %% X coordinate [~, indX] = unique(B(:, 2), 'rows'); % duplicate indices duplicate_indX = setdiff(1:size(B, 1), indX); % duplicate values duplicate_

我有一个矩阵B 1631x5

第2列和第3列分别表示X和Y坐标

我想确定B(I+k,2)==B(I+j,2)&B(I+k,3)==B(I+j,3)的索引。请注意,可以有多个副本

以下是识别重复项的脚本:

%% X coordinate
[~, indX] = unique(B(:, 2), 'rows');
% duplicate indices
duplicate_indX = setdiff(1:size(B, 1), indX);
% duplicate values
duplicate_valueX = B(duplicate_indX, 2);


%% Y coordinate
[~, indY] = unique(B(:, 3), 'rows');
% duplicate indices
duplicate_indY = setdiff(1:size(B, 1), indY);
% duplicate values
duplicate_valueY = B(duplicate_indY, 3);

%% Both coordinates
duplicate_ind=intersect(duplicate_indX,duplicate_indY);
duplicate_value = B(duplicate_ind, 2:3);
当执行代码时,我们得到2个矩阵:duplicate_ind(1x149)和duplicate_value(149x2)

让我们先考虑复制品的前4个值,例如:

>> duplicate_ind(1:4)

ans =

    61    77   106   111
这些索引的对应值为

 >> duplicate_value(1:4,:)

ans =

  355.3035  176.9755
  364.7316  182.2644
  354.4987  202.1553
  350.5895  226.7602
现在我可以找到原件和副本了:

find(B(:,2)==duplicate_value(1,1))

ans =

     1
    61

>> find(B(:,2)==duplicate_value(2,1))

ans =

    57
    77
在这种情况下,原始值的索引为1,重复值的索引为61。在其他情况下:正本:57,副本:77

现在,我想用原始索引替换副本的索引。在我们的例子中,61将被1取代(77将被57取代)。考虑到上述情况,我想构建一个大小为1631x3的矩阵(必须具有与矩阵B相同的行数),如下所示:

1   1   2
2   2   3
3   3   4
...
57  57  58
...
61  1   62
...
77  57  78
78  78  79
...
已解决:

%% X coordinate
[~, indX] = unique(B(:, 2), 'rows');
% duplicate indices
duplicate_indX = setdiff(1:size(B, 1), indX);
% duplicate values
duplicate_valueX = B(duplicate_indX, 2);


%% Y coordinate
[~, indY] = unique(B(:, 3), 'rows');
% duplicate indices
duplicate_indY = setdiff(1:size(B, 1), indY);
% duplicate values
duplicate_valueY = B(duplicate_indY, 3);

%% Both coordinates
duplicate_ind=intersect(duplicate_indX,duplicate_indY);
duplicate_value = B(duplicate_ind, 2:3);

indexes=zeros(3,size(duplicate_value,1));
for i=1:size(duplicate_value,1)
    if size(find(B(:,2)==duplicate_value(i,1)&B(:,3)==duplicate_value(i,2)),1)==2
        indexes(1:2,i)=find(B(:,2)==duplicate_value(i,1)&B(:,3)==duplicate_value(i,2));
    end
    if size(find(B(:,2)==duplicate_value(i,1)&B(:,3)==duplicate_value(i,2)),1)==3
        indexes(1:3,i)=find(B(:,2)==duplicate_value(i,1)&B(:,3)==duplicate_value(i,2));
    end    
end

for j=1:size(B,1)-1
    lines(j,1:2)=j;
    lines(j,3)=j+1;
end   

for j=1:size(lines,1)
    for i=1:1:size(indexes,2)
        if indexes(3,i)==0
            if lines(j,2)==indexes(2,i)
                lines(j,2)=indexes(1,i);
            end

            if lines(j,3)==indexes(2,i)
                lines(j,3)=indexes(1,i);
            end
        end

        if indexes(3,i)~=0
            if lines(j,2)==indexes(3,i)
                lines(j,2)=indexes(1,i);
            end

            if lines(j,3)==indexes(3,i)
                lines(j,3)=indexes(1,i);
            end

            if lines(j,2)==indexes(2,i)
                lines(j,2)=indexes(1,i);
            end

            if lines(j,3)==indexes(2,i)
                lines(j,3)=indexes(1,i);
            end
        end

    end
end

这个问题定义为“不清楚你在问什么”。您可能需要重新表述它,因为此时它非常混乱欢迎使用Stack Overflow!目前这个问题相当模糊。请回答这个问题以澄清你的意思。至少还包括输入,而且由于堆栈溢出不是一种代码编写服务,因此您的代码将以一种新的形式出现。最后,您可能有兴趣阅读这里的内容。谢谢您的回答。这个问题经过编辑,我希望现在更清楚。