我有两个大小相等的矩阵
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
所以。 正确的做法是什么?最快的方法是什么?
谢谢!
您可以进行逐元素乘积,然后沿第一个轴进行
sum
:
X = sum(conj(A).*B,1);
Y = sum(conj(A).* (W*B), 1);
如果您想将结果作为列向量,请转置 (
.'
) 或伴随 ('
) 结果。