有没有一种很好的方法来测试两个数组在MATLAB中是否成比例?类似于isequal
函数,但用于测试比例性。
答案 0 :(得分:5)
这样做的一种启发式方法是简单地将一个数组除以另一个元素,并确保此结果中的最大值和最小值在一定容差范围内。退化的情况是你在数组中有零。在这种情况下,使用max
和min
不会影响此算法的工作方式,因为这些函数会忽略nan
值。但是,如果 A
和B
都是零数组,那么可能存在无限数量的标量倍数,因此没有一个答案。如果我们遇到这个问题,我们会将其设置为nan
。
鉴于A
和B
,这样的事情可行:
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')