如何求Octave/MATLAB中vector的每两个对应元素之间的范围?

How to find range between every two corresponding elements of vector in Octave/MATLAB?

说,我有两个向量:

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 中的元素明智的数字范围之类的东西。我该怎么做?我不想使用任何循环。

根据您的评论,您可以智能地调用 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代表Binary Singleton EXpansion FUN 动作。如果您熟悉 repmat 函数,它本质上是在幕后复制矩阵和向量,以便您操作的两个输入具有相同的大小。在这种情况下,我所做的是指定 a 作为第一个输入,并将从 0b(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