我有两个向量, idx1
和idx2
,我想在两者之间取得值。 如果idx1
和idx2
是数字,而不是载体,我能做到这一点的方式如下:
idx1=1;
idx2=5;
values=idx1:idx2
% Result
% values =
%
% 1 2 3 4 5
但对我来说, idx1
和idx2
是可变长度的向量。 例如,对于长度= 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的可以更容易地做到这一点。
您的样本输出是不合法的。 矩阵不能具有不同长度的行。 你可以做的是使用创建单元阵列arrayfun
:
values = arrayfun(@colon, idx1, idx2, 'Uniform', false)
向得到的单元阵列转换成向量,就可以使用cell2mat
:
values = cell2mat(values);
替代地,如果所得到的单元阵列中的所有矢量具有相同的长度,则可以如下构建一个输出矩阵:
values = vertcat(values{:});
尝试采取了集合的并集。 鉴于值idx1
和idx2
你提供,运行
values = union(idx1(1):idx1(2), idx2(1):idx2(2));
这将产生一个矢量与值[5 6 7 8 9 10 11]
如需要的话。
我不能让@埃坦的解决方案的工作,显然你需要指定参数结肠。 随后的小改了它在我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
,但我已经包括这些为完整起见。
有一个伟大的博客文章被称为罗兰 矢量化冒号(:)的观念 。 它包括一个答案是快约5倍(用于大阵列)比使用arrayfun
或for
-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);