我有一个数组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]
非常感谢
答案 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