给定一个生成器:
myVec1 = rand(0:4, 2)
myVec2 = rand(0:4, 8)
myGen = (val1 + val2 for val1 in myVec1, val2 in myVec2)
这基本上是一个有2列的矩阵。可以通过使用collect(myGen)
进行查看。
我怎样才能创建一个生成器,每次调用产生两个值(基本上是一列)?
从概念上讲,相当于:
for myCol in eachcol(collect(myGen))
@show myCol;
end
即使没有显式分配矩阵。
我能否为以下情况包装 myGen
:
for value1, value2 in myGen
dosomethingelse1(value1, value2)
end
换句话说,我想要创建一个生成器,可以返回2个(或更多?)连续的值,并且可以在循环中使用。
所以基本上,我们会在生成器中创建一个二维数组,我想一次访问整个切片。对于实际数组,我可以使用 eachcol
和 eachrow
来完成,但是生成器怎么办呢?
下面是一个测试案例:
myVec1 = rand(0:4, 2);
myVec2 = rand(0:4, 800);
@btime begin
myMat = [val1 + val2 for val1 in myVec1, val2 in myVec2];
outVec = [sum(myCol) for myCol in eachcol(myMat)];
end
@btime begin
myGen = (val1 + val2 for val1 in myVec1, val2 in myVec2);
outVec = [sum(myCol) for myCol in Iterators.partition(myGen, 2)];
end
@Bogumił Kamiński提供的解决方案确实可行,但实际上,由于某种原因,它会创建更多的分配内存,而不是减少。
IterTools.product
可以实现的笛卡尔积吗? - Przemyslaw Szufel