Matlab 将多行插入矩阵,移动现有行 问题:

Matlab 将多行插入矩阵,移动现有行 问题:,matlab,matrix,vectorization,Matlab,Matrix,Vectorization,我正在寻找一种最有效的方法,将多行R插入指定行I之前的矩阵m,同时向下移动现有行 例子: 结果应为矩阵: [-6 -6 -6 -6 1 1 1 1 2 2 2 2 -7 -7 -7 -7 -8 -8 -8 -8 3 3 3 3 4 4 4 4 -9 -9 -9 -9 5 5 5 5] 下面的方法会起作用,但我认为只有当I中的索引按递增顺序排序时(如果不是,您总是可以先添加一些排序步骤)。在任何情况下,我都会用“真实”数据进行测试: 这使得

我正在寻找一种最有效的方法,将多行
R
插入指定行
I
之前的矩阵
m
,同时向下移动现有行

例子: 结果应为矩阵:

[-6 -6 -6 -6
  1  1  1  1
  2  2  2  2
 -7 -7 -7 -7
 -8 -8 -8 -8
  3  3  3  3
  4  4  4  4
 -9 -9 -9 -9
  5  5  5  5]

下面的方法会起作用,但我认为只有当
I
中的索引按递增顺序排序时(如果不是,您总是可以先添加一些排序步骤)。在任何情况下,我都会用“真实”数据进行测试:

这使得:

>> MM
MM =

  -6  -6  -6  -6
   1   1   1   1
   2   2   2   2
  -7  -7  -7  -7
  -8  -8  -8  -8
   3   3   3   3
   4   4   4   4
  -9  -9  -9  -9
   5   5   5   5

下面的方法会起作用,但我认为只有当
I
中的索引按递增顺序排序时(如果不是,您总是可以先添加一些排序步骤)。在任何情况下,我都会用“真实”数据进行测试:

这使得:

>> MM
MM =

  -6  -6  -6  -6
   1   1   1   1
   2   2   2   2
  -7  -7  -7  -7
  -8  -8  -8  -8
   3   3   3   3
   4   4   4   4
  -9  -9  -9  -9
   5   5   5   5

此功能在上提供。它的基本功能是:

ind = [1:size(M, 1) I-1];
[~, ind] = sort(ind);
MR = [M; R];
MR = MR(ind,:);

此功能在上提供。它的基本功能是:

ind = [1:size(M, 1) I-1];
[~, ind] = sort(ind);
MR = [M; R];
MR = MR(ind,:);

这可能是一种方法-

R_rowind = cumsum([I(1) diff(I)+1]) %// Row indices where rows from R are
                                    %// to be inserted in the output matrix
rowidx_arr = 1:size(M,1)+size(R,1)  %// array of [1 : number_of_rows_in_output]
out(setdiff(rowidx_arr,R_rowind),:) = M %// Insert rows from M into output array
out(R_rowind,:) = R %// Insert rows from R into output array
请注意,要将M中的行插入到输出数组中,您也可以使用基于
bsxfun
的替代方法-

out(all(bsxfun(@ne,rowidx_arr,R_rowind'),1),:) =  M

这可能是一种方法-

R_rowind = cumsum([I(1) diff(I)+1]) %// Row indices where rows from R are
                                    %// to be inserted in the output matrix
rowidx_arr = 1:size(M,1)+size(R,1)  %// array of [1 : number_of_rows_in_output]
out(setdiff(rowidx_arr,R_rowind),:) = M %// Insert rows from M into output array
out(R_rowind,:) = R %// Insert rows from R into output array
请注意,要将M中的行插入到输出数组中,您也可以使用基于
bsxfun
的替代方法-

out(all(bsxfun(@ne,rowidx_arr,R_rowind'),1),:) =  M

我真的不确定我应该做什么,因为看起来你只是把
R
放在
M
上,但是你可以试试
mtx=[M;R]
或者
mtx=vertcat(M,R)
@patrik,这不是OP想要的。他想在I给定的位置将R行插入M。这不是一个简单的串联。@am304我明白了,而且,对不起,这当然不是您想要的,我不确定我应该做什么,因为看起来您只是在
M
上堆叠了
R
,但是您可以尝试
mtx=[M;R]
mtx=vertcat(M,R)
@patrik这不是OP想要的。他想在I给定的位置将R行插入M。这不是简单的串联。@am304我明白了,对了,对不起,当然不是你想要的,好主意。不知道
ismember
函数。我理解这相当于稀疏(I+(0:l-1),1,true,m+l,1);也许这可以加快速度。啊,好主意。不知道
ismember
函数。我理解这相当于稀疏(I+(0:l-1),1,true,m+l,1);也许这甚至可以加快速度。也是个好主意,它似乎类似于@am304的方法,但没有逻辑索引。所以我想这也需要排序
I
。我想对于少量的插入,
bsxfun
会很快。也是个好主意,它看起来类似于@am304 s方法,但没有逻辑索引。所以我想这也需要排序
I
。我想对于少量的插入,
bsxfun
会很快。哇,这是一个非常好的方法!哇,这是一个非常好的方法!