我在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
提供的所有输出似乎都没有提供所需的矩阵。有帮助吗?
答案 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]