MATLAB中矩阵二次型的向量化

时间:2017-01-27 18:25:56

标签: 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是(M x N)标量单元格。 b是(M x 1)向量的N x K)单元格。 f是(M x N)矩阵的K x K)单元格。 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;

谢谢!

2 个答案:

答案 0 :(得分:2)

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

.docx

答案 1 :(得分:0)

这是针对性能的最具矢量化形式 -

% 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);