基于公差的单元格中的唯一向量

时间:2014-12-11 16:55:15

标签: matlab unique cell

我试图制作一个搜索算法,根据容差级别查找单元格的唯一列。 MATLAB(R2012a)的unique功能不提供容差输入。下面是我到目前为止的代码;我现在仅限于根据第一个身份(j = 1)检查唯一性,但是,这需要稍后更新。

输出是:我获得了一个商店单元格,其中包含所有向量,期望重复[0;1;0]。但是,维护其他副本(例如[1;0;-0.4]

clear all; close all; clc;
%%
tolerance=1e-6;
U_vector{1} = [0  1      0 1       1      0 1      0 1          1;
               1  0      1 0       0      1 0      1 0          0;
               0 -0.4238 0 0.4238 -0.4238 0 0.4238 0 0.8161001 -0.8161];

for i = 1:1:size(U_vector,2)
    k=1;
    store{i}(:,k) = U_vector{i}(:,k);
    for j=1;%:1:(size(U_vector{i},2))
        for m=j:1:(size(U_vector{i},2))
            if (abs(U_vector{i}(:,j)-U_vector{i}(:,m)) >= tolerance)
                k=k+1;
                store{i}(:,k) = U_vector{i}(:,m);
            end
        end
    end
end

3 个答案:

答案 0 :(得分:3)

有一个未记录的函数来合并类似的点,这也适用于行:

>> u = [0  1      0 1       1      0 1      0 1          1;
               1  0      1 0       0      1 0      1 0          0;
               0 -0.4238 0 0.4238 -0.4238 0 0.4238 0 0.8161001 -0.8161];
>> uMerged = builtin('_mergesimpts',u.',0.3).'
uMerged =
         0    1.0000    1.0000    1.0000    1.0000
    1.0000         0         0         0         0
         0   -0.8161   -0.4238    0.4238    0.8161

在你的案例中得到u = U_vector{1};,然后将结果打包到一个单元格中(out{1} = uMerged;)。

此外,该函数可以采用向量容差来指示每列的容差。从此函数的命令行消息:

  

Tolerance must be a scalar or a vector with the same number of columns as the first input 'X'.

所以这也有效:

uMerged = builtin('_mergesimpts',u.',[eps eps 0.3]).'
顺便说一下:未来可能会有一个官方功能,但我们不允许讨论:)。

答案 1 :(得分:1)

您不需要这么多嵌套循环。这适用于您提供的示例。

它使用的工作表会在找到重复项时减少。

for ii = 1:1:size(U_vector,2)
    A = U_vector{ii} ;          %// create a working copy of the current table
    store{ii} = [] ;            %// initialize the result cell array
    endOfTable = false ;
    while ~endOfTable
        store{ii}(:,end+1) = A(:,1) ;                   %// save the first column of the table
        idx = logical( sum( abs( bsxfun(@minus,A(:,2:end),A(:,1))) >= tolerance ) ) ;   %// find the indices of the columns not within the tolerance
        A = A(:, [false idx] ) ;                        %// remove the duplicate columns in A
        if size(A,2) < 2 ; endOfTable = true ; end      %// exit loop if we reached the last column
    end
    %// store last column if it remained unmatched
    if size(A,2) == 1
        store{ii}(:,end+1) = A(:,1) ;
    end
end

您的数据输出:

>> store{1}
ans =
         0    1.0000    1.0000    1.0000    1.0000
    1.0000         0         0         0         0
         0   -0.4238    0.4238    0.8161   -0.8161

答案 2 :(得分:0)

这个怎么样?!:

u = cell2mat(U_vector{1});
i=1;
while i<=size(u,2)
  test=repmat(u(:,i),1,size(u,2)); % compare matrix entries to current column i
  differentCols = ~all(same);      % column indices that are not equal to column i 
  differentCols(i)=1;              % ensure one such column stays in u
  u=u(:,differentCols);            % new u-> keep different columns
  i=i+1;                           % next column
end
u                                  % print u

似乎为我工作,但没有保证。