如何在Matlab中对大量减法进行矢量化

时间:2013-07-11 21:48:19

标签: matlab vectorization

我有一个数组(“真正的”笛卡尔坐标),其大小为(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

但这似乎效率很低。有更快,更有效的方法吗?

感谢。

2 个答案:

答案 0 :(得分:3)

使用bsxfun

 xyz_diff = bsxfun(@minus, xyz_true', xyz_obs)

答案 1 :(得分:2)

另一种解决方案,在我看来更具可读性,是使用矩阵乘法:

xyz_diff =  xyz_obs-ones(nobs,1)*xyz_true;