MATLAB中矩阵求积的矢量化

MATLAB中矩阵求积的矢量化,matlab,performance,matrix,vector,vectorization,Matlab,Performance,Matrix,Vector,Vectorization,为了提高计算效率,我尝试在Matlab中“矢量化”这个循环 for t=1:T j=1; for m=1:M for n=1:N y(t,j) = v{m,n} + data(t,:)*b{m,n} + data(t,:)*f{m,n}*data(t,:)'; j=j+1; end end end 其中v是标量的(MxN)单元b是(Kx1)向量的(MxN)单元f是(KxK)矩阵的(MxN)单元data是一个(TxK

为了提高计算效率,我尝试在Matlab中“矢量化”这个循环

for t=1:T
   j=1;
   for m=1:M
      for n=1:N
         y(t,j) = v{m,n} + data(t,:)*b{m,n} +  data(t,:)*f{m,n}*data(t,:)';
         j=j+1;
      end
   end
end
其中
v
是标量的(
M
x
N
)单元
b
是(
K
x1)向量的(
M
x
N
)单元
f
是(
K
x
K
)矩阵的(
M
x
N
)单元
data
是一个(
T
x
K
)数组

举一个例子来说明我的意思,我用来矢量化没有二次项的相同循环的代码是:

B = [reshape(cell2mat(v)',1,N*M);cell2mat(reshape(b'),1,M*N)];
X = [ones(T,1),data];
y = X*B;

谢谢

对于那些对此感兴趣的人,我找到了解决方案

f = f';
tMat = blkdiag(f{:})+(blkdiag(f{:}))';
y2BB = [reshape(cell2mat(v)',1,N*M);...
        cell2mat(reshape(b',1,M*N));...
        reshape(diag(blkdiag(f{:})),K,N*M);...
        reshape(tMat((tril(tMat,-1)~=0)),sum(1:K-1),M*N)]; 
y2YBar = [ones(T,1),data,data.^2];

jj=1;
kk=1;
ll=1;
for k=1:sum(1:K-1)
    y2YBar = [y2YBar,data(:,jj).*data(:,kk+jj)];
    if kk<(K-ll)
        kk=kk+1;
    else
        kk=1;
        jj=jj+1;
        ll=ll+1;
    end
end
y = y2YBar*y2BB;
f=f';
tMat=blkdiag(f{:})+(blkdiag(f{:}));
y2BB=[重塑(单元2Mat(v)”,1,N*M);。。。
cell2mat(重塑(b',1,M*N));。。。
重塑(diag(blkdiag(f{:})),K,N*M);。。。
重塑(tMat((tril(tMat,-1)~=0)),和(1:K-1),M*N)];
y2YBar=[一(T,1),数据,数据。^2];
jj=1;
kk=1;
ll=1;
对于k=1:sum(1:k-1)
y2bar=[y2bar,数据(:,jj)。*数据(:,kk+jj)];

如果kk这是针对性能的最矢量化形式-

% Extract as multi-dim arrays
vA = reshape([v{:}],M,N);
bA = reshape([b{:}],K,M,N);
fA = reshape([f{:}],K,K,M,N);

% Perform : data(t,:)*f{m,n} for all iterations
data_f_mult = reshape(data*reshape(fA,K,[]),T,K,M,N);

% Now there are three parts :
% v{m,n}
% data(t,:)*b{m,n}
% data(t,:)*f{m,n}*data(t,:)';

% Compute those parts one by one
parte1 = vA(:).';
parte2 = data*reshape(bA,[],M*N);

parte3 = zeros(T,M*N);
for t = 1:T
    parte3(t,:) = data(t,:)*reshape(data_f_mult(t,:,:),K,[]);
end

% Finally sum those up and to present in desired format permute dims
sums = bsxfun(@plus, parte1, parte2 + parte3);
out = reshape(permute(reshape(sums,T,M,N),[1,3,2]),[],M*N);

最后一个循环很马虎,但我的大脑很痛。让我知道如果你想一个更有效的方法来添加这些元素。干得好!我会测试哪一个最有效,然后选择那个答案。考虑到我的应用程序T=152、N=K=3和M=8,我的循环次数要少得多。是的,你的代码运行在0.025,我的代码运行在0.008左右。再次感谢你的回答。