三维矩阵矢量化装配程序



我有以下组装程序

nP = small integer ( 1~100 )
nQ = small but larger than nP
nE = large integer ( 10^5~7)
f  = @(x) math_expression % for example, sin(pi*x).^4
x    = (nQ x nE)
Mass = (nQ x nP)

我要构造的是

M = (nP x nP x nE) : 3D matrix

h = x(nQ,:)-x(1,:);
for k = 1 : nE
     M(:,:,k) = Mass'*diag(f(x(:,k))*Mass*h(k);
end

这将用于构造带有预定义索引矩阵的块对角矩阵

sparse(IM(:),JM(:),M(:),nE*nP,nE*nP,nP*nP*nE);

我想做的是通过向量化

来移除for
Mass'*diag(f(x(:,k))*Mass*h(k)

我试着像

那样使用bsxfun
assmble = @(dummy,k) Mass'*diag(f(x(:,k))*Mass*h(k)
Mass = bsxfun(assmble,Mass,reshape(1:nE,1,1,nE));

然而,matlab表示bsxfun不是正确的使用方式。

有什么建议吗?

这是一个解决方案:

i = repmat(1:nQ,1,nE);
j = 1:(nQ*nE);
d = sparse(i,j,f(x(:)));
Mass_d = reshape(Mass'*d,nP,nQ,nE);
Mass_d_t = permute(Mass_d,[2,1,3]);
Mass_d_t_r = reshape(Mass_d_t, nQ ,nP*nE);
M_d_M = Mass'*Mass_d_t_r;
M_d_M_h = bsxfun(@times,M_d_M, repelem(h,nP));
M = reshape(M_d_M_h, nP , nP , nE);

但是,您可能需要清除不需要的变量以防止内存问题

相关内容

  • 没有找到相关文章

最新更新