如何在Octave / MATLAB中找到矢量的每两个相应元素之间的范围?

时间:2015-09-11 15:58:51

标签: arrays matlab matrix octave

说,我有两个向量:

a = [1 , 2 , 3]
b = [4 , 5 ,6]

我想从a和b构建一个矩阵,如下所示:

c = [1:4 , 2:5 , 3:6].

即。

c = |1 2 3 4|
    |2 3 4 5|
    |3 4 5 6|

我基本上想要a和b中的元素明智的数字范围。我该怎么做?我不想使用任何循环。

1 个答案:

答案 0 :(得分:3)

根据您的评论,您可以智能地使用对bsxfun的调用:

>> c = bsxfun(@plus, a.', 0:(b(1)-a(1)));
>> c

c =

     1     2     3     4
     2     3     4     5
     3     4     5     6

那么这段代码是如何工作的呢? bsxfun代表 B inary S ingleton E X pansion FUN ction。如果您熟悉repmat函数,它基本上会复制矩阵和向量,以便您操作的两个输入具有相同的大小。在这种情况下,我正在做的是将a指定为第一个输入,将0的向量指定为b(1)-a(1)作为第二个输入。请注意a 转置。通过此bsxfun自动广播每个输入,以便输入在维度上匹配。具体来说,第一个输入是列向量a,因此这将重复并水平堆叠多次,与向量0:(b(1)-a(1))中的数量相同。同样,向量0:(b(1)-a(1))水平堆叠,以获得与a中一样多的值。完成此操作后,只需通过@plus函数将两个矩阵逐个元素组合在一起,然后得到结果。

鉴于每对ab的范围相同,您需要做的就是找出b中第一个元素与第一个元素之间的差异a中的元素,然后创建从0b(1)-a(1)的向量,并将其添加到a中的每个值。这会产生一个矩阵,其中每一行都有您想要的所需范围。在这种情况下,我认为你根本不需要b。您只需在每行中定义所需的元素,就可以忽略b。在你的情况下,你想要每行四个元素,所以我会这样做:

>> n = 4;
>> c = bsxfun(@plus, a.', 0:n-1);
>> c

c =

     1     2     3     4
     2     3     4     5
     3     4     5     6