根据范围索引从Matrix中提取行?

Eno*_*oon 3 indexing matlab matrix vectorization

我有一个矩阵ANxM大小.我还有一个B包含索引对的数组,这些索引代表A我想要提取的行.

A = [ 1  2  3 %1
      4  5  6 %2
      7  8  9 %3
     10 11 12 %4
     13 14 15 %5
     16 17 18]%6
B = [1 2
     4 6]
Run Code Online (Sandbox Code Playgroud)

我想要C包含A1到2和4到6的行

C = [ 1  2  3 %1
      4  5  6 %2
     10 11 12 %4
     13 14 15 %5
     16 17 18]%6
Run Code Online (Sandbox Code Playgroud)

有没有办法解决这个问题而不进行迭代B?我试过C = A(B,:)但它不起作用(我没想到它......)

Div*_*kar 7

使用bsxfun结肠模拟功能,它利用二重奏bsxfun(@lebsxfun(@ge-

N = size(A,1)
[R,~] = find((bsxfun(@le,B(:,1),1:N) & bsxfun(@ge,B(:,2),1:N)).')
out = A(R,:)
Run Code Online (Sandbox Code Playgroud)

样品运行#1 -

>> A
A =
     1     2     3
     4     5     6
     7     8     9
    10    11    12
    13    14    15
    16    17    18
>> B
B =
     1     2
     4     6
>> out
out =
     1     2     3
     4     5     6
    10    11    12
    13    14    15
    16    17    18
Run Code Online (Sandbox Code Playgroud)

示例运行#2(展示如何处理重叠) -

>> A
A =
     1     2     3
     4     5     6
     7     8     9
    10    11    12
    13    14    15
    16    17    18
>> B
B =
     1     2
     4     6
     3     5
>> out
out =
     1     2     3
     4     5     6
    10    11    12
    13    14    15
    16    17    18
     7     8     9
    10    11    12
    13    14    15
Run Code Online (Sandbox Code Playgroud)

不是矢量化解决方案,但更高效的内存解决方案可能与colon operator-

idx = arrayfun(@colon, B(:,1), B(:,2), 'Uni', 0)
out = A([idx{:}],:)
Run Code Online (Sandbox Code Playgroud)