将两个矩阵按列相乘以获得向量

问题描述 投票:0回答:1

我有两个大小相等的矩阵

A
B
,它们实际上是独立列向量的集合。我需要对
*
中的每一列与
mtimes
中的相应列执行“矩阵乘法”(
A
B
)。结果我得到一个向量,其元素数等于列数。最简单的方法是循环,但我需要这样做数千次,并且我的矩阵至少具有
>2000x16...200
的大小 - 所以矢量化会有所帮助。

此外,还涉及到一个权重矩阵。

考虑以下示例:

nDof  = 250;    % number of rows
nCols = 16;     % number of columns

% Example complex matrices 
A = rand(nDof,nCols) + 1j*rand(nDof,nCols); 
B = rand(nDof,nCols) + 1j*rand(nDof,nCols); 
% Weighting Matrix
W = rand(nDof,nDof)  + 1j*rand(nDof,nDof); 

% Option 1: Loop - multpliy matrices column by column with/without wighting
X1 = zeros(nCols,1);  Y1 = zeros(nCols,1);
for ii = 1:nCols
    X1(ii) = A(:,ii)'     * B(:,ii);
    Y1(ii) = A(:,ii)' * W * B(:,ii);
end

% Option 2: avoid loop
X2temp = A'     * B;
Y2temp = A' * W * B;
% => seemingly diagonal elements are what I need
X2 = diag(X2temp);
Y2 = diag(Y2temp);
    
% Test
disp(X2-X1)
disp(Y2-Y1)

如您所见,在选项 2 中,我尝试通过直接将矩阵相乘来避免循环。所得矩阵的对角线元素非常接近循环的结果。但只是接近而不是相等。尽管对于我的情况来说,错误可能非常小,但它似乎太大,不能仅由浮点不准确引起。

测试结果:

X2-X1  =  1.0e-13 *

  0.426325641456060 + 0.355271367880050i
  0.284217094304040 + 0.852651282912120i
 -0.284217094304040 - 0.426325641456060i
  0.000000000000000 + 0.142108547152020i
 -0.284217094304040 - 0.213162820728030i
  0.284217094304040 - 0.923705556488130i
  0.568434188608080 + 0.355271367880050i
  0.000000000000000 + 0.142108547152020i
  0.000000000000000 + 0.071054273576010i
 -0.284217094304040 + 0.497379915032070i
  0.284217094304040 - 0.426325641456060i
 -0.284217094304040 + 0.142108547152020i
  0.000000000000000 + 0.000000000000000i
 -0.284217094304040 + 0.142108547152020i
 -0.284217094304040 - 0.213162820728030i
  0.284217094304040 - 0.284217094304040i

Y2-Y1 = 1.0e-10 *

  0.000000000000000 + 0.036379788070917i
 -0.018189894035459 + 0.072759576141834i
 -0.072759576141834 - 0.072759576141834i
  0.036379788070917 - 0.109139364212751i
  0.090949470177293 + 0.054569682106376i
 -0.109139364212751 + 0.054569682106376i
  0.109139364212751 - 0.163709046319127i
  0.018189894035459 - 0.127329258248210i
  0.072759576141834 - 0.018189894035459i
  0.036379788070917 - 0.036379788070917i
  0.018189894035459 + 0.000000000000000i
  0.109139364212751 - 0.072759576141834i
 -0.018189894035459 - 0.018189894035459i
  0.000000000000000 - 0.054569682106376i
 -0.018189894035459 + 0.036379788070917i
  0.036379788070917 - 0.036379788070917i

所以。 正确的做法是什么?最快的方法是什么?

谢谢!

arrays matlab matrix vectorization matrix-multiplication
1个回答
0
投票

您可以进行逐元素乘积,然后沿第一个轴进行

sum

X = sum(conj(A).*B,1);
Y = sum(conj(A).* (W*B), 1);

如果您想将结果作为列向量,请转置 (

.'
) 或伴随 (
'
) 结果。

© www.soinside.com 2019 - 2024. All rights reserved.