我有一个数组(“真正的”笛卡尔坐标),其大小为(natoms*3,1)
,其中natoms
是原子数。我还有大量(500,000)个观测值存储在一个大小为(nobs, natoms*3)
的数组中。现在,我想创建一个所有观察与真实坐标之间差异的数组。我想通过执行类似
for iat = 1:natoms
xyz_dif = xyz_obs(:, 3*iat-2:3*iat) - xyz_true(3*iat-2:3*iat)
end
但这不起作用。相反,我被迫像这样经历每一个观察:
for iat = 1:natoms
for iobs = 1:nobs
xyz_diff(iobs, 3*iat-2:3*iat) = xyzs(iobs, 3*iat-2:3*iat) - xyz_true(3*iat-2:3*iat)
end
end
但这似乎效率很低。有更快,更有效的方法吗?
感谢。
答案 0 :(得分:3)
使用bsxfun
xyz_diff = bsxfun(@minus, xyz_true', xyz_obs)
答案 1 :(得分:2)
另一种解决方案,在我看来更具可读性,是使用矩阵乘法:
xyz_diff = xyz_obs-ones(nobs,1)*xyz_true;