matlab 将行插入线性索引的折叠矩阵

6tdlim6h  于 2023-03-30  发布在  Matlab
关注(0)|答案(1)|浏览(151)

假设我们有一个n维逻辑数组P,它描述了n空间中的某些位置是“设置”还是“清除”。(关于某个属性),并且这些位置也沿着二维浮点矩阵Q的 * 行 * 表示。下标P(a1,a2,...,an)到线性索引Q(idx,:)的Map在MATLAB的常用列中完成-但是,只有在P中设置(true)的位置才能在Q中有一行;我认为这是一个穷人的方式来实现数据的稀疏表示。(我必须使用这个有点复杂的P/Q数据结构;我无法改变)。
到目前为止一切顺利。然而,一旦PQ被构建,我可能想在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)。

bf1o4zei

bf1o4zei1#

下面是一个不使用sortismember的解决方案:

idx = zeros(numel(P), 1);

idxold = find(P);
P = P | deltaP; 
Q = [Q ; deltaQ]; 
idx(P) = 1:size(Q, 1);
Q([idx(idxold); idx(find(deltaP))], :) = Q;

该解决方案需要预先分配索引向量idx

相关问题