我的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,:)
,但它没有用(我没想到它......)
答案 0 :(得分:7)
使用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{:}],:)
答案 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