假设我们有一个n
维逻辑数组P
,它描述了n空间中的某些位置是“设置”还是“清除”。(关于某个属性),并且这些位置也沿着二维浮点矩阵Q
的 * 行 * 表示。下标P(a1,a2,...,an)
到线性索引Q(idx,:)
的Map在MATLAB的常用列中完成-但是,只有在P
中设置(true)的位置才能在Q
中有一行;我认为这是一个穷人的方式来实现数据的稀疏表示。(我必须使用这个有点复杂的P/Q数据结构;我无法改变)。
到目前为止一切顺利。然而,一旦P
和Q
被构建,我可能想在P
中设置更多的条目,并将相应的行添加到Q
。这必须在不破坏P和Q之间的n位置Map的情况下完成。我已经提出了一个例程来实现这一点:
idxold=find(P);
P=P|deltaP; %deltaP only contains new positions we want to set; a sanity check with any(P(:)&deltaP(:)) has been performed already
Q=[Q ; deltaQ]; %deltaQ contains new rows corresponding to the positions in deltaP
idxnew_ideal=find(P); %this is the order the rows of Q should be in
idxnew=[idxold ; idxnew_ideal(~ ismember(idxnew_ideal,idxold))]; %this is the order the rows of Q effectively are in at the moment
[~,rowidxs]=sort(idxnew); %order in which the rows of Q have to be reassembled
Q=Q(rowidxs,:);
是否有更智能的方法在正确的位置将行插入Q
?
**编辑(示例数据)。**典型输入可以是:
P=zeros([3 3 2 2]);
P(1,1:3,2,1)=1;
ncolsQ=7;
Q=randi([-9 9],[sum(~~P(:)) ncolsQ]);
deltaP=zeros(size(P));
deltaP(2,2,1:2,1)=1;
deltaQ=randi([-9 9],[sum(~~deltaP(:)) ncolsQ]);
其中,例如,Q(1,:)
描述n位置(1,1,2,1),deltaQ(2,:)
描述n位置(2,2,2,1)。
1条答案
按热度按时间bf1o4zei1#
下面是一个不使用
sort
和ismember
的解决方案:该解决方案需要预先分配索引向量
idx
。