我试图制作一个搜索算法,根据容差级别查找单元格的唯一列。 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
答案 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
似乎为我工作,但没有保证。