2017-01-30 98 views
0

情況:快速索引到數據陣列

我有UINT8的數據陣列(例如UINT8(零(24 * 30000,1))),其編碼24各字節的30000點。說,我有一個指向這個數據數組的數組,例如1:2:30000。我知道想要有效地爲指向向量中引用的點創建正確的數據數組。例如,當嘗試使用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是上述指數之向量和pointCloud_out.PointStep編碼多少字節有一個點( 24)。然而,這個解決方案在我的機器上需要大約1.5秒,而且這個解決方案需要很長的時間。

問:

你能想到的任何(非常)快速的解決方案做到這一點的?

+0

我對你在問什麼有點困惑。 pointCloud(:,indices)'有什麼問題? – Suever

+0

@Suever:pointCloud(-2消息)的數據字段是一個m×1的矩陣,在這裏 – user1809923

回答

1

您可以使用(0:PointStep-1)bsxfun

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

值加到假定startIndicesstartIndices

每個成員都有大小1 * n

+0

工作!必須改變爲索引= reshape(bsxfun(@plus,startIndices,(0:double(pointCloud_out.PointStep)-1))',[],1); ,因爲我的startIndices是nx1 – user1809923

0

想出了這個解決方案:

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

首先對數據數組進行重構,使每列對應一個點。然後我們將所有我們感興趣的點再次重新塑形。這個解決方案在我的PC上大約需要0.003秒。