Split vector in MATLAB

后端 未结 6 1023
独厮守ぢ
独厮守ぢ 2020-12-15 07:06

I\'m trying to elegantly split a vector. For example,

vec = [1 2 3 4 5 6 7 8 9 10]

According to another vector of 0\'s and 1\'s of the same

6条回答
  •  忘掉有多难
    2020-12-15 07:39

    Yet another way, but this time without any loops or accumulating at all...

    lengths = diff(find([1 cut 1])) - 1;    % assuming a row vector
    lengths = lengths(lengths > 0);
    data = vec(~cut);
    result = mat2cell(data, 1, lengths);    % also assuming a row vector
    

    The diff(find(...)) construct gives us the distance from each marker to the next - we append boundary markers with [1 cut 1] to catch any runs of zeros which touch the ends. Each length is inclusive of its marker, though, so we subtract 1 to account for that, and remove any which just cover consecutive markers, so that we won't get any undesired empty cells in the output.

    For the data, we mask out any elements corresponding to markers, so we just have the valid parts we want to partition up. Finally, with the data ready to split and the lengths into which to split it, that's precisely what mat2cell is for.

    Also, using @Divakar's benchmark code;

    -------------------- With CUMSUM + ACCUMARRAY
    Elapsed time is 0.272810 seconds.
    -------------------- With FIND + ARRAYFUN
    Elapsed time is 0.436276 seconds.
    -------------------- With CUMSUM + ARRAYFUN
    Elapsed time is 17.112259 seconds.
    -------------------- With mat2cell
    Elapsed time is 0.084207 seconds.
    

    ...just sayin' ;)

提交回复
热议问题