2016-04-29 460 views

回答

1

如果你想找出这些值在行内是重复的,你可以这样做:

[vals, col_idx] = sort(A,2); 
idx = bsxfun(@plus,(col_idx-1)*size(A,1), (1:size(A,1))'); 
is_duplicate(idx(:,2:end)) = vals(:,1:end-1) == vals(:,2:end); 
is_duplicate = reshape(is_duplicate, size(A)); 

is_duplicate =

0  0  1  0  0  0  1 
0  0  0  0  1  0  0 
0  0  0  0  0  0  0 

从那里,这取决于你在找什么结果的。你可以设置重复,以NaN或其他一些价值,或者你可以将它们设置为NaN,但随后他们转移到该行的末尾,使用类似以下内容:

col_idx = cumsum(~is_duplicate, 2); 
idx = bsxfun(@plus,(col_idx-1)*size(A,1), (1:size(A,1))'); 
A_new = nan(size(A)); 
A_new(idx(~is_duplicate)) = A(~is_duplicate); 

a_new进行=

2  3  5  6  7 NaN NaN 
1  2  5  4  6  7 NaN 
7  5  3  9  8  1  2 
+0

谢谢。这是我想要的, – Gaze

4

结果不能再是矩阵,因为每一行都有不同的长度。作为行的单元阵列载体可以按如下方式获得结果:

B = mat2cell(A, ones(size(A,1),1)); %// convert matrix to cell array of its rows 
B = cellfun(@(x) unique(x,'stable'), B, 'uniformoutput', 0); %// stably remove duplicates 

对于示例矩阵

A = [2 3 2 5 6 7 2; 
    1 2 5 4 5 6 7; 
    7 5 3 9 8 1 2]; 

这给

B{1} = 
    2  3  5  6  7 
B{2} = 
    1  2  5  4  6  7 
B{3} = 
    7  5  3  9  8  1  2 
+0

谢谢你的回答。这是一个很好的代码,但我更愿意将它保留为矩阵而不是行向量。我会采取丹曼的回答。祝你有个愉快的日子 – Gaze

+0

@Gaze当然!我不确定你想要什么。祝你有美好的一天! –

相关问题