说,我有两个向量:
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中的元素明智的数字范围。我该怎么做?我不想使用任何循环。
答案 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
函数将两个矩阵逐个元素组合在一起,然后得到结果。
鉴于每对a
和b
的范围相同,您需要做的就是找出b
中第一个元素与第一个元素之间的差异a
中的元素,然后创建从0
到b(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