Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 如何在矩阵的每一行中找到唯一元素的数量?_Matlab_Matrix_Unique - Fatal编程技术网

Matlab 如何在矩阵的每一行中找到唯一元素的数量?

Matlab 如何在矩阵的每一行中找到唯一元素的数量?,matlab,matrix,unique,Matlab,Matrix,Unique,我正在尝试实现某种插值算法I是一个N*4矩阵,包含N其他点周围点的索引。但是I的每一行中的元素可能不是唯一的,这意味着其中两个或多个元素可能引用单个点。我想知道每行中有多少唯一的索引可用,我想尽快完成,因为N很大 您需要对每行使用unique函数,并计算结果的元素: arrayfun(@(x) numel(unique(I(x,:))), (1:size(I,1)).') 索引数组被转置,因此结果是一个列向量。这是这个问题的一般解决方案,但是arrayfun对我来说太慢了。所以我想了一下,找到

我正在尝试实现某种插值算法
I
是一个N*4矩阵,包含
N
其他点周围点的索引。但是
I
的每一行中的元素可能不是唯一的,这意味着其中两个或多个元素可能引用单个点。我想知道每行中有多少唯一的索引可用,我想尽快完成,因为
N
很大

您需要对每行使用
unique
函数,并计算结果的元素:

arrayfun(@(x) numel(unique(I(x,:))), (1:size(I,1)).')
索引数组被转置,因此结果是一个列向量。

这是这个问题的一般解决方案,但是
arrayfun
对我来说太慢了。所以我想了一下,找到了一个更快的解决方案。 我比较所有列对,如果它们相等,则增加一个计数器:

tic;
S = zeros(N, 1, 'uint32');
Nu = S+4; % in my case most of point are surrounded by four different points
for i=1:3
    for j=(i+1):4
        S = S + uint32(I(:, i)==I(:, j));
    end
end
% Nu(S==0) = 4;
Nu(S==1) = 3;
Nu((S==2)|(S==3)) = 2; % why? :)
Nu(S==6) = 1;
toc;
对于
N=189225
arrayfun
在我的电脑上需要14.73秒,但求和只需要0.04秒

编辑:处理不同数量的列

下面是对上面代码的修改。现在我们还可以在每一行中有唯一值的位置!这个没有
:)
问题,可以用于更高数量的列。在我的电脑上,189225行仍使用0.04秒

tic;
uniq = true(N, 4);
for i=1:3
    for j=(i+1):4
          uniq(I(:, i)==I(:, j), j) = false;
    end
end
Nu = sum(uniq, 2);
toc;
编辑(2):与的比较

过了一段时间,我需要这个来解决另一个问题,我希望矩阵的每一行中有不同列数的唯一元素。所以我将我的代码与EBH的代码进行比较,看看他们的代码是否更快。我在矩阵上运行了两个代码,行从10K到100K,列从6到60。结果是3次不同运行的平均时间(以秒为单位):


我在2016a对此进行了测试,在最新版本的MATLAB中,for循环的性能有了显著提高。因此,如果您想在旧版本中运行它,您可能需要自己进行比较。

这里有一种无循环的超快速方法:

accumarray(repmat(1:size(I,1),1,size(I,2)).',I(:),[],@(x) numel(unique(x)))

这将给你一个向量大小N,其中k处的元素是
I(k,:)

中唯一元素的数量,请检查我的答案。我是米沙姆;)如何编辑上述语法,使其不考虑将零作为唯一元素?