【发布时间】:2014-06-28 01:54:55
【问题描述】:
我目前正在编写代码以使用有限差分矩阵方法实现 3D 稳态热方程的数值近似。这涉及将二阶 PDE 分解为矩阵 A 并求解 Ax=b。其中 x 是每个指定网格点的温度。可在此处找到有关此类问题的更多信息:
http://people.nas.nasa.gov/~pulliam/Classes/New_notes/Matrix_ODE.pdf
为了完成这个问题,我用一个 2D 数组表示 3D 矩阵 A,它使用以下形式的索引函数调用 1D 数组 b 中的值:
i+(j-1)*Nx+Nx*Ny*(k-1)
对于 3D 矩阵的第 (i,j,k) 个元素,其中 Nx, Ny, Nz 是 x,y,z 坐标中的点数。为了创建矩阵 A 和 b 最终需要进行大量循环计算,我想知道运行这些循环的计算效率最高且内存消耗更少的方法是什么,即使用类似
for j=1:Ny
for i=2:Nx-1
b(i+(j-1)*Nx)=D4;
end
end
for j=1:Ny
for i=2:Nx-1
b(i+(j-1)*Nx+Nx*Ny*(Nz-1))=D3;
end
end
或者我应该将它们压缩成一个循环,例如:
for j=1:Ny
for i=2:Nx-1
b(i+(j-1)*Nx)=D4;
b(i+(j-1)*Nx+Nx*Ny*(Nz-1))=D3;
end
end
我已经预先分配了数组 A 和 b。是否也有一种矢量化的方式来做到这一点?
【问题讨论】:
标签: matlab memory for-loop vectorization