问题简介:
我建模了一个系统,其中我有一个矩阵X =([0,0,0]; [0,1,0],...),其中每一行代表一个3D空间中的一个点。然后,我选择一个随机行r,并获取所有后续行并围绕由r表示的点旋转,并从这些行X_rot创建一个新矩阵。我现在想检查X_rot中的任何行是否等于X的任何一行(即两个顶点彼此叠加),如果是这种情况,则拒绝旋转并再试一次。
实际问题:
到目前为止,我使用了以下代码:
X_sim=[X;X_rot];
if numel(unique(X_sim,'rows'))==numel(X_sim);
X(r+1:N+1,:,:)=X_rot;
end
哪个有效,但它占用了我50%的运行时间,而且我在考虑是否有人在这里知道更有效的方法,因为我不需要我从{获得的所有信息{1}}。
P.S。如果它很重要,那么我通常在unique
中有100到1000行。
祝你好运, 的Morten
其他
我的X
- 矩阵包含N + 1行,我有12种不同的旋转操作,可以应用于子矩阵x_rot:
x
答案 0 :(得分:2)
两种可能的方法(我不知道它们是否比使用unique
更快):
使用pdist2
:
d = pdist2(X, X_rot, 'hamming'); %// 0 if rows are equal, 1 if different.
%// Any distance function will do, so try those available and choose fastest
result = any(d(:)==0);
使用bsxfun
:
d = squeeze(any(bsxfun(@ne, X, permute(X_rot, [3 2 1])), 2));
result = any(d(:)==0);
result
行等于1
的某一行,则{p> X
为X_rot
,否则为0
。
答案 1 :(得分:1)
ismember(X_rot, X, 'rows')
怎么样?