测试数组是否成比例

时间:2016-06-29 15:57:56

标签: arrays matlab

有没有一种很好的方法来测试两个数组在MATLAB中是否成比例?类似于isequal函数,但用于测试比例性。

3 个答案:

答案 0 :(得分:5)

这样做的一种启发式方法是简单地将一个数组除以另一个元素,并确保此结果中的最大值和最小值在一定容差范围内。退化的情况是你在数组中有零。在这种情况下,使用maxmin不会影响此算法的工作方式,因为这些函数会忽略nan值。但是,如果 AB都是零数组,那么可能存在无限数量的标量倍数,因此没有一个答案。如果我们遇到这个问题,我们会将其设置为nan

鉴于AB,这样的事情可行:

C = A./B; % Divide element-wise
tol = 1e-10; % Divide tolerance

% Check if the difference between largest and smallest values are within the
% tolerance
check = abs(max(C) - min(C)) < tol;

% If yes, get the scalar multiple
if check
    scalar = C(1);
else % If not, set to NaN
    scalar = NaN;
end

答案 1 :(得分:3)

如果您有统计工具箱,则可以使用pdist2计算两个阵列之间的'cosine'距离。如果它们成比例,这将给出0

>> pdist2([1 3 5], [10 30 50], 'cosine')
ans =
     0

>> pdist2([1 3 5], [10 30 51], 'cosine')
ans =
     3.967230676171774e-05

如@rayryeng所述,如果处理实数,请务必使用容差。

答案 2 :(得分:2)

/*
drop    table tbl_one;
drop    table   tbl_two;

create  table tbl_one(id int, companyName varchar(20)) ;
Insert into tbl_one values
(1,  'CompanyOne'), 
(2,  'CompanyTwo')  ;

create  table tbl_two(id int,type varchar(20), content varchar(20));
insert into tbl_two values
(1 ,  'zipcode'  ,   '54321'),
(1 ,  'category' ,   'Car dealers'),
(2 ,  'zipcode'  ,   '54321'),
(2 ,  'category' ,   'Supermarkets');
*/
SELECT t1.*
FROM  tbl_one t1
WHERE t1.id in (select t2.id from tbl_two t2 where t2.id = t1.id and t2.type = 'zipcode' AND t2.content = '54321')
and     t1.id in (select t3.id from tbl_two t3 where t3.id = t1.id and t3.type = 'category' AND t3.content = 'Car dealers')