【问题标题】:How to find range between every two corresponding elements of vector in Octave/MATLAB?如何在 Octave/MATLAB 中找到向量的每两个对应元素之间的范围?
【发布时间】:2015-09-11 15:58:50
【问题描述】:

说,我有两个向量:

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 完成您想要的操作,但请注意:只要您的范围长度不相等,它们就无法放入同一个矩阵中。 (我将bsxfun 解决方案留给有这方面经验的人)
  • 是否存在以下情况:(1)每个向量的长度不相等?...也就是说,您是否保证矩阵中的每个向量具有相同的长度? (2) 在没有有效范围的情况下怎么办?...例如,如果a 为 1,b 为 -1,该怎么办?
  • @rayryeng 是的,保证范围的长度相同,并且a中的元素会小于b中的对应元素。

标签: arrays matlab matrix octave


【解决方案1】:

鉴于您的 cmets,您可以智能地使用对 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 FUNction。如果您熟悉 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

【讨论】:

  • 这确实有效。你能解释一下你到底做了什么吗?
  • 非常感谢!我理解你的逻辑!
  • @AdityaNaidu - 现在试试 :) 我添加了更多细节。希望有帮助!
猜你喜欢
  • 2022-11-21
  • 1970-01-01
  • 2019-05-26
  • 2012-12-27
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多