数组每列中的唯一元素(Matlab)

rap*_*ppr 1 arrays matlab element unique vectorization

我可能对Matlab有点生疏,也许这个问题的答案比我现在想象的更微不足道.但是我在网上搜索了有效的解决方案而我还没有找到,所以我会在这里试试.

我有一个大矩阵,类似于y:

N = 1e6; k = 20; n = 100;
y = ceil(n * rand(k, N));
Run Code Online (Sandbox Code Playgroud)

对于数组的每一列,我想计算唯一元素的数量.循环非常慢:

tic
r = zeros(N, 1);
for ii = 1:N
  r(ii) = numel(unique(y(:, ii)));
end
toc
Run Code Online (Sandbox Code Playgroud)

寻找矢量化,更快的版本.


大卫的回答似乎也是正确而快速的.谢谢!

N = 1e6; k = 20; n = 100;
y = ceil(n * rand(k, N));

tic
r1 = zeros(N, 1);
for ii = 1:N
  r1(ii) = numel(unique(y(:, ii)));
end
toc

tic
r2 = sum(diff(sort(y)) ~= 0) + 1;
toc

all(r1' == r2)
Run Code Online (Sandbox Code Playgroud)

Dav*_*vid 6

试试这个

sum(diff(sort(y))~=0)+1
Run Code Online (Sandbox Code Playgroud)

它使用做矢量化的函数.for对于你的情况,性能似乎比你的循环好,但是我认为对于更大的问题,由于内存限制,我提出的解决方案会变得更糟.

使用N=1e5,你的方法在我的计算机上需要大约7.5秒,我的建议需要大约0.05秒.有N=1e6,时间是~75s和~0.75s.