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