从矩阵的每一行提取唯一元素(Matlab)

4

我希望能够对给定矩阵的每一行应用唯一的函数,而不涉及任何循环。假设我有以下4x5矩阵:

full(A) = [0    1     0     0    1
           2    1     0     3    0
           1    2     0     0    2
           0    3     1     0    0]

其中A是对应的稀疏矩阵。例如,使用for循环,可以这样做:

uniq = cell(4,1);
for i = 1:4
    uniq{i} = unique(A(i,:));
end

我将获得唯一的单元结构,该结构由以下代码提供:

uniq{1} = {1}
uniq{2} = {[1 2 3]}
uniq{3} = {[1 2]}
uniq{4} = {[1 3]}

有没有更快的向量化方法来避免使用for循环?我需要将其应用到大型M-by-5矩阵上。 请注意,我不关心每行唯一元素的数量(对于这样的问题,我知道有大约的答案)。
2个回答

4
您可以使用自定义函数结合accumarray来实现。
A = sparse([0 1 0 0 1; 2 1 0 3 0; 1 2 0 0 2; 0 3 1 0 0]); % data
[ii, ~, vv] = find(A);
uniq = accumarray(ii(:), vv(:), [], @(x){unique(x.')});

这将会得到:
>> celldisp(uniq)
uniq{1} =
     1
uniq{2} =
     1     2     3
uniq{3} =
     1     2
uniq{4} =
     1     3

1
我该说什么呢...你又再次救了我! - EBH

2

您可以使用num2cell(A,2)将每一行转换为单元格,然后使用cellfununique获取每一行唯一值的单元格数组:

% generate large nX5 matrix
n = 5000;
A = randi(5,n,5);    
% convert each row into cell
C = num2cell(A,2);
% take unique values from each cell
U = cellfun(@unique,C,'UniformOutput',0);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接