我在 Matlab 中有一个三维数组。第一个维度是时间,第二个维度是湿度,第三个维度是温度。如果温度值 例如,如果数组是:>> sampl = randn(4,3,2)sampl(:,:,1) = 0.79487 0.71017 -0.39167 0.51754 -1.3068 0.84166 0.49461 0.74159 0.082784 0.66393 1.4677 0.31467sampl(:,:,2) = 0.78981 1.3096 1.0434 -0.80122 0.16037 -1.0682 -0.32565 -2.1182 -0.31723 0.28468 0.70708 1.4797将其转换为最有效的方法是什么:sampl(:,:,1) = 0.79487 0.71017 NaN 0.51754 NaN NaN 0.49461 NaN NaN 0.66393 NaN NaNsampl(:,:,2) = 0.78981 1.3096 1.0434 NaN 0.16037 NaN NaN NaN NaN NaN NaN NaN具体来说,对于特定的切片,我们希望沿着每一列进行处理,一旦我们在某一列中遇到负数,我们希望该位置是 NaN 以及该 NaN 值之后的同一列的所有行位置也是 NaN 。 最佳答案 另一种简单的方法是找到原始矩阵中那些为负的位置,创建另一个矩阵,将这些值设置为 NaN ,调用 cumsum 或沿该新矩阵每个切片中每一列的所有行的累积和,然后设置将这个cumsum结果中的对应位置到原始矩阵中的NaN得到最终结果:>> out = sampl;>> out(out < 0) = NaN;>> out = cumsum(out);>> sampl(isnan(out)) = NaNsampl(:,:,1) = 0.7949 0.7102 NaN 0.5175 NaN NaN 0.4946 NaN NaN 0.6639 NaN NaNsampl(:,:,2) = 0.7898 1.3096 1.0434 NaN 0.1604 NaN NaN NaN NaN NaN NaN NaNcumsum 在这里有用的原因是因为我们基本上会沿着其行独立地检查每一列,并不断累积每列的所有行,这些行具有有效的条目 直到 我们命中一列的 NaN 值。在此值之后,cumsum 中的后续值将独立成为每个切片中每一列的 NaN。这样,在我们击中列中的第一个NaN之后,无论之后遇到什么值(NaN或有效数字),cumsum中的结果仍然是NaN。在我们遇到矩阵列中的第一个负数后,这会有效地传播 NaN 值。最后一点是在这个矩阵中找到这些位置,并将原始矩阵中的相应位置设置为 NaN ,从而给出我们的结果。关于matlab - 在第一个负数后将元素转换为 NaN,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28907842/