Matlab中矩阵相等元素的位置对

时间:2018-08-03 10:34:51

标签: matlab

我在Matlab中有一个行向量A,其中包含可能重复的整数。希望您帮助构建一个矩阵B,该矩阵报告A的相等元素的所有可能位置对。如下面的评论所述,最困难的部分是我不想在B个“冗余”对中列出。

让我用一个例子更好地解释。

clear
A=[100 101 100 100 101 200];

我们可以看到

%A(1)=A(3)=A(4);
%A(2)=A(5);

因此

 B=[1 3; 1 4; 2 5];

或等效地

B=[1 3; 3 4; 2 5];

B=[1 4; 3 4; 2 5];

我对获得上面报告的三个向量B中的任何一个都无动于衷。

注意我不想要

B=[1 3; 1 4; 3 4; 2 5];

因为(1,3), (1,4), (3,4)中的一对是多余的,即,如果A(1)=A(3)A(1)=A(4),则A(4)=A(3),对于其他组合也是如此。

我尝试使用unique,但是unique提供的所有输出似乎都没有提供所需的矩阵。有帮助吗?

2 个答案:

答案 0 :(得分:3)

如果您不喜欢使用循环,请按照@Wolfie的answer中的建议使用accumarray

[~,~,idx]=unique(A,'stable');
B = accumarray                                      ...
    (                                               ...
        idx(:),                                     ...
        (1:numel(A)).',                             ...
        [],                                         ...
        @(x)                                        ...
        {                                           ...
            [repmat(x(1),numel(x)-1,1) x(2:end,1)]  ...
        }                                           ...
    );
result = vertcat(B{:})

答案 1 :(得分:2)

这里需要考虑的部分是冗余配对。删除冗余配对的最简单方法是为每个值都有一个关键索引,并将所有匹配的值链接到该索引。

在您的示例中,这意味着使用以下关系

% A(1) = A(3)
% A(1) = A(4)
% A(2) = A(5)

与每个值的第一个等价项(例如A(3)=A(4))都隐含在其中。

为此,我们可以使用unique的最后索引输出,然后循环遍历以建立此等效索引。请参阅下面的代码,并附有注释以供理解:

% A is the input row vector
A=[100 101 100 100 101 200];
% Get the 'unique' indexing output
[~, ~, juA] = unique(A);
% Set up output as cell so we don't have to worry about how many rows each
% equivalence will take up.
B = cell( max(juA), 1 );
% Loop through all of the unique indices
for ii = 1:max(juA)    
    % Get indices where the value is equal to the current value   
    k = find( juA == ii );  
    % Output for this value is [1 x; 1 y; 1 z; ...] where x/y/z are indices
    % of equivalent values
    B{ii} = [repmat(k(1), numel(k)-1, 1), k(2:end)]; 
end
% Concatenate cell array B to be a 2 column numeric array
B = vertcat(B{:});

输出:

>> B = [1 3; 1 4; 2 5]