首页 文章

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

提问于
浏览
5

我想对给定矩阵的每一行应用唯一的函数,而不涉及任何for循环 . 假设我有以下4乘5矩阵

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

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

有没有更快的方法来矢量化这个并避免循环?我需要将其应用于M-by-5矩阵,M大 . 请注意,我对每行的唯一元素数量不感兴趣(我知道这个问题有很多答案) .

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
    
  • 2

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

    % 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);
    

相关问题