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

时间:2015-09-11 13:03:40

标签: matlab matrix indexing vectorization

我的A大小为NxM。我还有一个数组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]

我希望C包含A从1到2和4到6的行

C = [ 1  2  3 %1
      4  5  6 %2
     10 11 12 %4
     13 14 15 %5
     16 17 18]%6

如果没有迭代B,有没有办法解决这个问题? 我试过了C = A(B,:),但它没有用(我没想到它......)

2 个答案:

答案 0 :(得分: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,:)

示例运行#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

示例运行#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

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

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

答案 1 :(得分:2)

愚蠢的方式当然是使用for循环:

C = []; % Initialise empty matrix
for ii = 1:size(B,1)
   Ctmp = A(B(ii,1):B(ii,2),:); % Extract rows
   C = [C;Ctmp]; % Add them to the existing matrix
end
相关问题