根据数组的内容选择范围

时间:2012-06-15 16:57:19

标签: arrays matlab matrix

我有两个数组。我想根据存储在另一个中的数组位置列表,从其中一个数据中复制数据范围。例如,如果第一个数组由100行和2列组成,我可能想要复制行10-20,行60-70和行75-79。如果是这种情况,那么第二个数组的内容如下:

b =

    10    20
    60    70
    75    79

为了根据第二个数组选择第一个数组的相应行(让我们称之为'a'),我会做以下事情:

b = [a(1,1):a(1,2) a(2,1):a(2,2) a(3,1):a(3,2)]

这是有效的,并且返回数组'b',它基本上是数组'a',并且提取了正确的内容。

问题是,数组'b'实际上包含50到60行(即要包括的范围)。

如何使上述代码更有效,以便它适用于'b'中的任意行数?

3 个答案:

答案 0 :(得分:2)

示例:

a = rand(100,1);
ranges = [
    10    20
    60    70
    75    79
];
idx = arrayfun(@colon, ranges(:,1), ranges(:,2), 'Uniform',false);
idx = [idx{:}];

b = a(idx)

答案 1 :(得分:0)

您可以使用for,假设从a中提取的值的范围在b中,并且应该转到c:

% input
a = rand(100,2);
b = [10 20; 60 70; 75 79];
% output
c = zeros(1,2);
for i = 1:size(b,1)
    c = vertcat(c a(b(i,1):b(i,2), :));
end        
c = c(2:size(c,1), :);

答案 2 :(得分:0)

使用cellfun和单元格数组的解决方案:

%一些示例数据:

a = reshape(1:100, 10, 10);
b = [ 2 3; 5 8; 10 10 ];

以下是代码:

bCell = mat2cell(b, 3, [ 1 1 ]);

aRows = cell2mat(arrayfun(@(x,y) a(x:y, :), bCell{1}, bCell{2}, 'UniformOutput', false));