阵列(MATLAB)的每一列中的唯一元素



我可能对Matlab有点生锈,也许这个问题的答案比目前我想象的要小。但是我已经在线搜索了有效的解决方案,但我没有找到任何解决方案,所以我会在这里尝试。

我有一个大型矩阵,在这里类似y:

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

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

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

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


David 的答案似乎也正确且快速。谢谢!

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)

尝试此

sum(diff(sort(y))~=0)+1

使用执行矢量的函数。对于您的情况,性能似乎比您的for循环更好,但是我想对于更大的问题,由于记忆限制,我的建议解决方案会变得更糟。

使用N=1e5,您的方法在我的计算机上需要〜7.5s,而我的建议则为〜0.05。使用N=1e6,时间为〜75s和〜0.75s。

最新更新