matlab中怎样计算一个矩阵中每个数的平方
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab中怎样计算一个矩阵中每个数的平方相关的知识,希望对你有一定的参考价值。
使用点运算。如果原矩阵式A,可以使用A.*A或者A.^2
MatLab中点运算是对相同维数的矩阵的对应元素进行相应的运算。
.* 点乘,相同维数的矩阵的对应元素相乘。
.^ 点乘幂,A.^B相同维数的矩阵A元素的B对应元素次幂。A.^n矩阵A中所有元素取n次幂。
.\\ 点左除,相同维数的矩阵的对应元素进行\\运算。
./ 点右除,相同维数的矩阵的对应元素进行/运算。
具体步骤:
一、加和减:
加减法的命令很简单,直接用加或者减号就可以了。如:
c=a+b
d=a-b
二、乘法:
一般乘法:c=a*b,要求a的列数等于b的行数。
如果a,b是一般的向量,如a=[1,2,3] b=[3,4,5]
点积: dot(a,b),
叉积: cross(a,b)
卷积: conv(a,b)
三、除法:一般在解线性方程组时会用到。
x=a\\b 如果ax=b,则 x=a\\b是矩阵方程的解。
x=b/a 如果xa=b, 则x=b/a是矩阵方程的解。
四、转置:
转置时,矩阵的第一行变成第一列,第二行变成第二列,。。。
x=a.'
五、求逆:
要求矩阵为方阵。这在矩阵运算中很常用。
x=inv(a)
参考技术A 这个计算可利用matlab数组计算,如:a=magic(3)
b=a.^2
结果是:
a =
8 1 6
3 5 7
4 9 2
b =
64 1 36
9 25 49
16 81 4本回答被提问者采纳
在Matlab中有效地计算成对平方欧几里德距离
给出两组d
维点。如何在Matlab中最有效地计算成对平方欧氏距离矩阵?
符号:第一组由(numA,d)
矩阵A
给出,第二组由(numB,d)
矩阵B
给出。得到的距离矩阵的格式应为(numA,numB)
。
示例点:
d = 4; % dimension
numA = 100; % number of set 1 points
numB = 200; % number of set 2 points
A = rand(numA,d); % set 1 given as matrix A
B = rand(numB,d); % set 2 given as matrix B
这里通常给出的答案是基于bsxfun
(参见例如[1])。我提出的方法基于矩阵乘法,结果比我能找到的任何类似算法快得多:
helpA = zeros(numA,3*d);
helpB = zeros(numB,3*d);
for idx = 1:d
helpA(:,3*idx-2:3*idx) = [ones(numA,1), -2*A(:,idx), A(:,idx).^2 ];
helpB(:,3*idx-2:3*idx) = [B(:,idx).^2 , B(:,idx), ones(numB,1)];
end
distMat = helpA * helpB';
请注意:对于常数d
,可以通过硬编码实现替换for
-loop,例如
helpA(:,3*idx-2:3*idx) = [ones(numA,1), -2*A(:,1), A(:,1).^2, ... % d == 2
ones(numA,1), -2*A(:,2), A(:,2).^2 ]; % etc.
评价:
%% create some points
d = 2; % dimension
numA = 20000;
numB = 20000;
A = rand(numA,d);
B = rand(numB,d);
%% pairwise distance matrix
% proposed method:
tic;
helpA = zeros(numA,3*d);
helpB = zeros(numB,3*d);
for idx = 1:d
helpA(:,3*idx-2:3*idx) = [ones(numA,1), -2*A(:,idx), A(:,idx).^2 ];
helpB(:,3*idx-2:3*idx) = [B(:,idx).^2 , B(:,idx), ones(numB,1)];
end
distMat = helpA * helpB';
toc;
% compare to pdist2:
tic;
pdist2(A,B).^2;
toc;
% compare to [1]:
tic;
bsxfun(@plus,dot(A,A,2),dot(B,B,2)')-2*(A*B');
toc;
% Another method: added 07/2014
% compare to ndgrid method (cf. Dan's comment)
tic;
[idxA,idxB] = ndgrid(1:numA,1:numB);
distMat = zeros(numA,numB);
distMat(:) = sum((A(idxA,:) - B(idxB,:)).^2,2);
toc;
结果:
Elapsed time is 1.796201 seconds.
Elapsed time is 5.653246 seconds.
Elapsed time is 3.551636 seconds.
Elapsed time is 22.461185 seconds.
有关w.r.t的更详细评估数据点的维度和数量遵循以下讨论(@comments)。事实证明,在不同的环境中应该首选不同的算法。在非时间紧急情况下,只需使用pdist2
版本。
进一步发展:人们可以考虑用基于相同原理的任何其他指标替换平方欧几里得:
help = zeros(numA,numB,d);
for idx = 1:d
help(:,:,idx) = [ones(numA,1), A(:,idx) ] * ...
[B(:,idx)' ; -ones(1,numB)];
end
distMat = sum(ANYFUNCTION(help),3);
然而,这非常耗时。用d
二维矩阵替换较小的help
三维矩阵d
可能是有用的。特别是对于d = 1
,它提供了一种通过简单矩阵乘法计算成对差异的方法:
pairDiffs = [ones(numA,1), A ] * [B'; -ones(1,numB)];
你有什么进一步的想法吗?
对于平方欧几里德距离,也可以使用以下公式
||a-b||^2 = ||a||^2 + ||b||^2 - 2<a,b>
其中<a,b>
是a
和b
之间的点积
nA = sum( A.^2, 2 ); %// norm of A's elements
nB = sum( B.^2, 2 ); %// norm of B's elements
distMat = bsxfun( @plus, nA, nB' ) - 2 * A * B' ;
最近,我一直在told tha作为R2016b这个计算平方欧几里德距离的方法比接受的方法快。
以上是关于matlab中怎样计算一个矩阵中每个数的平方的主要内容,如果未能解决你的问题,请参考以下文章