矢量化三维矩阵的装配过程

时间:2016-08-13 02:11:47

标签: matlab multidimensional-array vectorization

我有以下装配程序

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

我想要做的是通过vectorize删除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的正确方法。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

这是一个解决方案:

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

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