【问题标题】:Unique elements in each column of an array (Matlab)数组每列中的唯一元素(Matlab)
【发布时间】:2015-07-26 20:22:47
【问题描述】:

我可能对 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

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


大卫的回答似乎也正确且快速。谢谢!

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)

【问题讨论】:

    标签: arrays matlab unique element vectorization


    【解决方案1】:

    试试这个

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

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

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

    【讨论】:

    • 可惜 swift 不能做这样的事情。
    • @SanthanSalai unique 也有效地做到了这一点,只是没有考虑到这种类型的事情。它先是t=sort(y),然后是find(t(1:end-1)~=t(2:end)),但没有设置为处理这样​​的矩阵。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    • 2021-03-15
    • 1970-01-01
    • 2015-03-07
    • 2017-11-09
    • 1970-01-01
    相关资源
    最近更新 更多