2016-08-06 回答
楼主试试下述代码:
%{
matlab 一个向量和矩阵中各行向量的夹角余弦值 求高手解答
比如a=(1,2,3,4,5)
b={1,2,3,4,5;
6,7,8,9,10;
11,12,13,14,15;
16,17,18,19,20}
分别求向量a与矩阵b中各行向量的夹角余弦值
并输出最大的夹角余弦值,及所对应的具体是哪一行向量
%}
function [cosxy maxcos maxcosangle rcmaxcos mincos mincosangle rcmincos] = ucos(x,y)
% ucos功能:
% (1) 计算矩阵 x 的各行向量与矩阵 y 的各行向量之间的夹角余弦,存储在输出项 cosxy 中;
% (2) 计算最大夹角余弦值及其所对应的角度,分别存储在输出项 maxcos 和 maxcosangle 中;
% (3) 输出最大余弦值所对应的 x 和 y 所在的行,存储在 rcmaxcos 中;
% (4) 计算最小夹角余弦值及其所对应的角度,分别存储在输出项 mincos 和 mincosangle 中;
% (5) 输出最小余弦值所对应的 x 和 y 所在的行,存储在 rcmincos 中;
[rx cx] = size(x);
[ry cy] = size(y);
if cx~=cy
error('输入的矩阵类型不匹配,输入的矩阵x和y必须列数相同')
end
cosxy = zeros(rx,ry);
for k = 1:rx
for l = 1:ry
cosxy(k,l) = sum(x(k,:).*y(l,:))/norm(x(k,:))/norm(y(l,:));
end
end
maxcos = max(max(cosxy));
maxcosangle = acos(maxcos);
[r c] = find(cosxy==maxcos); % 找出最大余弦值所在的行r和列c;
rcmaxcos = [r c];
disp(['最大余弦值出现在x的第 ' num2str(r) ' 行与y的第 ' num2str(c) ' 行.'])
mincos = min(min(cosxy));
mincosangle = acos(mincos);
[r c] = find(cosxy==mincos); % 找出最小余弦值所在的行r和列c;
rcmincos = [r c];
disp(['最小余弦值出现在x的第 ' num2str(r) ' 行与y的第 ' num2str(c) ' 行.'])
执行你的数据:
>> a = [1,2,3,4,5];
>> b = [1,2,3,4,5;
6,7,8,9,10;
11,12,13,14,15;
16,17,18,19,20];
>> [cosxy maxcos maxcosangle rcmaxcos mincos mincosangle rcmincos] = ucos(a,b);
最大余弦值出现在x的第 1 行与y的第 1 行.
最小余弦值出现在x的第 1 行与y的第 4 行.
cosxy = [ 1 0.964950504732767 0.945343100616969 0.935153458570522]
maxcos = 1
maxcosangle = 0
rcmaxcos = [1 1]
mincos = 0.935153458570522
mincosangle = 0.362104308112746
rcmincos = [1 4]