在Matlab中找到所有类似的数组索引

时间:2014-08-19 07:30:50

标签: matlab

我有一个数组X=[1 2 3 1.01 2.01 4 5 1.01 3.01]我希望这个数组的所有索引都相似,而matlab中的差异<=0.01答案是

    X1=[1 4 8], X2=[2 5],X3=[3 9],X4=[6],X5=[7]
非常感谢

3 个答案:

答案 0 :(得分:1)

我认为提交"unique with tolerance" in the FileExchange适合您。

你应该注意,将变量X1 ... X5创建为单独的变量是一个坏主意和一个不好的做法,因为这会在以后的代码中引用这些值(它是矢量化的或基于循环的)繁琐且低效。存储数据的更正确的替代方法是cells(如solution suggested by Daniel)或structs

话虽如此,如果由于某种原因你还想创建唯一命名的变量,可以使用上述提交(uniquetol)和eval的混合:

[~,b,c]=uniquetol(X,0.01+eps);
for ind1 = 1:length(b)
    eval(sprintf('X%d = (find(c==X(b(%d))))'';',ind1,ind1)); 
end

答案 1 :(得分:1)

这是一个使用for循环的解决方案。虽然不确定效率。试图找到另一种解决方案。

X=[1 2 3 1.01 2.01 4 5 1.01 3.01]
result=cell(length(X),1);
boarder = 0.01;
for n=1:length(X)
    helper = X(n);
    Y=X;
    Y(X>helper+boarder)=0;
    Y(X<helper-boarder)=0;    
    result(n,1)={find(Y)};
end

我预定义了一个包含所有索引(对于X的每个元素)的cellarray(result)。然后我循环遍历你的寄存器之外的元素为0.最后但并非最不重要的是我将索引保存到结果数组。

显然有些结果是相同的,但这样你也得到了案例的结果:X=[ 1.01, 1.02, 1.03, 1.04,...];

如果你想删除那些相同的元素,你可以再次循环数据并得到unique结果。

答案 2 :(得分:1)

Y=cell(5,1)
for idx=1:numel(Y)
   Y{idx}=find(abs(X-idx)<=.2);
end