假设我们有三个向量说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。
对于这个问题,使用循环不是一个好的选择,因为向量可能有更长的长度,并且在一般情况下向量的数量会增加,因此运行时间会花费很长时间。
感谢任何帮助...... 提前致谢
答案 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
是解决方案的数量,解决方案将是矩阵的列。