Arrays 根据数组的内容选择范围

Arrays 根据数组的内容选择范围,arrays,matlab,matrix,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)]

我有两个数组。我想根据其中一个存储在另一个中的数组位置列表,从其中一个复制数据范围。例如,如果第一个数组由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”中任意数量的行?

如果要从a中提取的值范围在b中,则可以使用a for,并应转到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), :);
例如:

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)

使用
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));

为了与MATLAB术语保持一致,您应该在适当的情况下使用
向量
矩阵
…从您的描述中不清楚它的可能副本,但如果
a
是矩阵(
a=rand(100,2);
),则使用:
b=a(idx,:)