【问题标题】:Select range based on contents of an array根据数组的内容选择范围
【发布时间】:2012-06-15 16:57:19
【问题描述】:

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

【问题讨论】:

标签: arrays matlab matrix


【解决方案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)

【讨论】:

  • 从你的描述中看不清楚,但如果a 是一个矩阵(a = rand(100,2);),那么使用:b = a(idx,:)
【解决方案2】:

您可以使用 a 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), :);

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2011-07-01
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      • 2015-01-17
      • 1970-01-01
      • 1970-01-01
      • 2021-11-02
      • 1970-01-01
      相关资源
      最近更新 更多