我想对给定矩阵的每一行应用唯一的函数,而不涉及任何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
我将获得
给出的单元结构uniquniq{1} = {1}
uniq{2} = {[1 2 3]}
uniq{3} = {[1 2]}
uniq{4} = {[1 3]}
有没有更快的方法来对此进行矢量化并避免循环? 我需要将其应用于M-by-5矩阵,M大。 请注意,我对每行的唯一元素数量不感兴趣(我知道这个问题有答案)。
答案 0 :(得分: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 :(得分:2)
您可以使用num2cell(A,2)
将每行转换为单元格,然后cellfun
转换为unique
,以获取每行中唯一值的单元格数组:
% 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);