【问题标题】:Matlab: select subarrays from indexes matrixMatlab:从索引矩阵中选择子数组
【发布时间】:2015-01-14 10:07:08
【问题描述】:

我有一个逻辑数组B 和一个大小为nx2 的矩阵A 包含n 一对启动/停止索引

A= [start1, stop1; start2, stop2; start3, stop3];

如何根据数组A中包含的开始/停止对选择数组B的子数组?

我是这样做的:

for i=1:1:size(A,1)     
    B(A(i,1):A(i,2)) = true;    
end

有没有什么方法可以在不使用 for 循环的情况下以更优雅的方式进行操作(甚至可以方便地重新排列数组 A)?

【问题讨论】:

    标签: arrays matlab indexing


    【解决方案1】:

    你可以

    n = numel(B);
    iA = zeros( 1, n+1 ); %// +1 for boundary case
    iA( A(:,1) ) = 1;
    iA( A(:,2)+1 ) = -1;
    iA(end) = []; %// discard boundary entry
    B( cumsum(iA) > 0 ) = true;
    

    假设

    1. A(:,1) 总是 >= 1
    2. A(:,2) 总是 n(B 中的元素数)
    3. A 中定义的部分不重叠

    【讨论】:

    • 如果B的大小是根据A定义的,你可以将n设置为n = max(A(:,2));
    • 不是。感谢您的建议,但是我应该定义一个我想避免的进一步矩阵。
    【解决方案2】:

    如果确保每个停止点都小于下一个开始点(索引范围不重叠),则另一种方法是

    B(mod(sum(bsxfun(@le, 1:numel(B), [A(:,1)-1; A(:,2)])),2)>0) = true;
    

    【讨论】:

    • @Shai :-) 但在这种情况下,它在内存方面可能非常低效
    • @Shai 哈哈哈同意了。 bsxfun 太有趣了!
    • 这似乎是 for 循环的一种紧凑形式,对吧?很有趣,谢谢
    • @RockeJoe 不仅紧凑,而且矢量化,即快速。 (相比之下,arrayfunfor 循环的紧凑形式,但速度很慢)。
    猜你喜欢
    • 2015-05-20
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 2019-09-18
    • 2016-10-02
    相关资源
    最近更新 更多