情况:
我有一个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秒,这是很长的时间。
问题:
你能想到任何(非常)快速的解决方案吗?
答案 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秒。