我有以下组装程序
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);
但是,您可能需要清除不需要的变量以防止内存问题