向量化冒号(:)的观念 - MATLAB两个向量之间的值(Vectorizing the Noti

2019-07-18 05:46发布

我有两个向量, idx1idx2 ,我想在两者之间取得值。 如果idx1idx2是数字,而不是载体,我能做到这一点的方式如下:

idx1=1;
idx2=5;
values=idx1:idx2 

% Result
 % values =
 % 
 %    1     2     3     4     5

但对我来说, idx1idx2是可变长度的向量。 例如,对于长度= 2:

idx1=[5,9];
idx2=[9 11];

我可以使用冒号操作员直接获得的价值? 这是,类似下面的内容:

values = [5     6     7     8     9     9    10    11]

我知道我可以做idx1(1):idx2(1)idx1(2):idx2(2)这是,分别提取各列的值,因此,如果没有其他的解决方案,我可以用做此for循环,但也许Matlab的可以更容易地做到这一点。

Answer 1:

您的样本输出是不合法的。 矩阵不能具有不同长度的行。 你可以做的是使用创建单元阵列arrayfun

values = arrayfun(@colon, idx1, idx2, 'Uniform', false)

向得到的单元阵列转换成向量,就可以使用cell2mat

values = cell2mat(values);

替代地,如果所得到的单元阵列中的所有矢量具有相同的长度,则可以如下构建一个输出矩阵:

values = vertcat(values{:});


Answer 2:

尝试采取了集合的并集。 鉴于值idx1idx2你提供,运行

values = union(idx1(1):idx1(2), idx2(1):idx2(2));

这将产生一个矢量与值[5 6 7 8 9 10 11]如需要的话。



Answer 3:

我不能让@埃坦的解决方案的工作,显然你需要指定参数结肠。 随后的小改了它在我R2010b中的版本工作:

step = 1; 
idx1 = [5, 9];
idx2 = [9, 11];
values = arrayfun(@(x,y)colon(x, step, y), idx1, idx2, 'UniformOutput', false);
values=vertcat(cell2mat(values));

注意, step = 1实际上是在默认值colon ,和Uniform可以代替使用UniformOutput ,但我已经包括这些为完整起见。



Answer 4:

有一个伟大的博客文章被称为罗兰 矢量化冒号(:)的观念 。 它包括一个答案是快约5倍(用于大阵列)比使用arrayfunfor -loop并且类似于运行长度解码:

这样做是为了扩大结肠序列出来。 我知道每个序列的长度,所以我知道输出阵列中的起始点。 用ls起始值后填充值。 然后,我想出多少从一个序列的末尾跳转到下一个的开始。 如果有反复启动值,跳跃可能为负。 一旦该阵列被填满时,输出仅仅是序列的累积总和或cumsum。

 function x = coloncatrld(start, stop) % COLONCAT Concatenate colon expressions % X = COLONCAT(START,STOP) returns a vector containing the values % [START(1):STOP(1) START(2):STOP(2) START(END):STOP(END)]. % Based on Peter Acklam's code for run length decoding. len = stop - start + 1; % keep only sequences whose length is positive pos = len > 0; start = start(pos); stop = stop(pos); len = len(pos); if isempty(len) x = []; return; end % expand out the colon expressions endlocs = cumsum(len); incr = ones(1, endlocs(end)); jumps = start(2:end) - stop(1:end-1); incr(endlocs(1:end-1)+1) = jumps; incr(1) = start(1); x = cumsum(incr); 


文章来源: Vectorizing the Notion of Colon (:) - values between two vectors in MATLAB