【问题标题】:finding increasing sequences of numbres from several vectors in MATLAB在 MATLAB 中从多个向量中找到递增的数字序列
【发布时间】:2016-01-07 06:31:48
【问题描述】:

假设我们有三个向量 a、b 和 c,包括如下递增的实数值:

a=[3 4 19 22];    
b=[1 10 15];
c=[3 5 11];

在 MATLAB 中查找此类问题中递增数字序列的最有效方法是什么(不使用循环)?

对于上面的例子,输出应该是这样的:

[3 10 11]
[4 10 11]

它们的第一个元素来自 a,第二个元素来自 b,第三个元素来自 c,因此它们应该有三个递增的元素。 注意:第一个数字必须来自a,第二个来自b,第三个来自c。

对于这个问题,使用循环不是一个好的选择,因为向量可能有更长的长度,一般情况下向量的数量会增加,所以运行时间会很长。

任何帮助将不胜感激...... 提前致谢

【问题讨论】:

  • 对不起,我可能太笨了,看不到这里的关系,但也许你可以为像我这样的白痴更仔细地解释一下?特别是要求选择一个数字。比如好像5也能满足要求,为什么不能选择c(2)?)。
  • 第一个数字必须来自a,第二个来自b,第三个来自c
  • 如果您不想使用循环,则必须将所有可能的组合存储在某个地方,然后可能会调用issorted。问题是组合矩阵会和所有输入向量的长度乘积一样大,可能会导致内存问题
  • 是的,你是对的,第一个数字必须来自 a,第二个来自 b,第三个来自 c
  • 对不起帕特里克,这是我的错。我已经编辑过了。谢谢

标签: matlab search vector sequence vectorization


【解决方案1】:

有几种方法可以解决这个问题,并且应该始终考虑时间与空间的收益。

方法 1(需要大量空间(n^3,其中 n 是数组的长度)但没有直接循环!):

[A,B,C] = meshgrid(a,b,c);
idxs = find((A<B)&(B<C));
[ib,ia,ic] = ind2sub(size(A),idxs);
answer = [a(1,ia);b(1,ib);c(1,ic)];

方法 2(需要更少的空间(n^2,其中 n 是数组的长度),但确实包含一个循环,但对于较大的 n 值似乎更快。如果您只需要这种方法会快得多找出有多少解决方案。):

ab = double(bsxfun(@lt,a',b));
bc = double(bsxfun(@lt,b',c));
abc = ab*bc;
numberOfAnswers = sum(abc(:));
[idx] = find(abc);
cumnum = [0;cumsum(abc(idx))];
[ia,ic] = ind2sub(size(abc),idx);
answer = zeros(3,numberOfAnswers);
for i = 1:numel(idx)
  answer(1,(cumnum(i)+1):cumnum(i+1)) = a(ia(i));
  answer(2,(cumnum(i)+1):cumnum(i+1)) = b((b>a(ia(i)))&(b<c(ic(i))));
  answer(3,(cumnum(i)+1):cumnum(i+1)) = c(ic(i));
end

编辑:这两种方法都会给出一个3-by-m-matrix,其中m 是解决方案的数量,解决方案将是矩阵的列。

【讨论】:

  • 我认为您需要转置最终矩阵以使其与预期输出匹配。
  • @kkuilla 你是对的。我在评论中详细说明了我的输出格式。
  • 最后转置会好很多。如果有人只是复制并粘贴代码,则可以减少混乱..
  • 很好地使用meshgrid
  • 如果我们想将这段代码推广到三个以上的向量怎么办?
猜你喜欢
  • 2012-07-17
  • 1970-01-01
  • 2018-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-26
  • 1970-01-01
相关资源
最近更新 更多