我有以下装配程序
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
的正确方法。
有什么建议吗?
答案 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);
但是,您可能需要清除不需要的变量以防止出现内存问题