数组每一列中的唯一元素 (Matlab)
Unique elements in each column of an array (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.5 秒,而我的建议需要 ~0.05 秒。使用 N=1e6
,时间分别为 ~75s 和 ~0.75s。
我可能对 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.5 秒,而我的建议需要 ~0.05 秒。使用 N=1e6
,时间分别为 ~75s 和 ~0.75s。