快速索引到数据数组

时间:2017-01-30 13:14:28

标签: matlab

情况:

我有一个uint8的数据数组(例如uint8(零(24 * 30000,1))),它编码30000个点,每个24字节。比如,我有一个indice向量到这个数据数组中,例如1:2:30000。我知道想要为indice向量中引用的点有效地创建正确的数据数组。例如,当尝试使用Robotics系统工具箱从“sensor_msgs / PointCloud2”消息中删除点时会出现这种情况。

解决方案

到目前为止,我的解决方案就像这样

startIndices = (pointIndices-1) * double(pointCloud_out.PointStep) + 1;
endIndices = pointIndices * double(pointCloud_out.PointStep);
indices = zeros(pointCloud_out.RowStep,1);
for ii = 1:numel(pointIndices)
    indices((ii-1)*pointCloud_out.PointStep+1 : ii*pointCloud_out.PointStep) = startIndices(ii):endIndices(ii);
end
pointCloud_out.Data = pointCloud_in_msg.Data(indices);

其中pointIndices是上面提到的indice向量,pointCloud_out.PointStep对一个点(24以上)的字节数进行编码。然而,这个解决方案在我的机器上需要大约1.5秒,这是很长的时间。

问题:

你能想到任何(非常)快速的解决方案吗?

2 个答案:

答案 0 :(得分:1)

您可以使用bsxfun

indices = reshape(bsxfun(@plus, startIndices , (0:pointCloud_out.PointStep-1).'),[],1);

(0:PointStep-1)的值添加到startIndices

的每个成员中

假设startIndices的尺寸为1 * n

答案 1 :(得分:0)

想出了这个解决方案:

pointsInCols = reshape(pointCloud_in_msg.Data,pointCloud_in_msg.PointStep,[]);
pointCloud_out.Data = reshape(pointsInCols(:,pointIndices),[],1);

首先重新整形数据数组,使每列对应一个点。然后我们采取我们感兴趣的所有要点并重新塑造。这个解决方案在我的电脑上大约需要0.003秒。