我有一个 NxM
大小的矩阵 A
。我还有一个数组 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,:)
但它没有用(我没想到它......)
最佳答案
使用 bsxfun
的冒号模拟能力利用了bsxfun(@le
和bsxfun(@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{:}],:)
关于matlab - 根据范围索引从矩阵中提取行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32524204/