在MATLAB

时间:2016-01-07 06:31:48

标签: matlab search vector sequence vectorization

假设我们有三个向量说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。

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

感谢任何帮助...... 提前致谢

1 个答案:

答案 0 :(得分:4)

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

方法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 - 矩阵,其中m是解决方案的数量,解决方案将是矩阵的列。