例如,[1 1 ; 2 2 ; 3 3]
变成
[1 1
1 1
1 1
2 2
2 2
2 2
3 3
3 3
3 3]
我正在使用这个:
expander(orig,mult::Int) = orig[ceil(Int,(1:size(orig,1)*mult)/mult),:];
在 Julia 中和以下在 Matlab 中:
function expanded = expander(original,multiplier)
expanded = original(ceil((1:size(original,1)*multiplier)/multiplier),:);
end
另一个 matlab 唯一的方法是这样的:
expanded = kron(original,ones(multiplier,1));
如果存在超快的 julia 选项,我会更喜欢它。
最佳答案
这并不能证明 kron
是最快的,但我将它的时间与用 ones 和 kron
填充类似大小的数组所需的时间进行了比较做得很好:
original = [1 1 ; 2 2 ; 3 3];
multiplier = 3*10^6;
@time begin
for idx = 1:100
expanded = kron(original,ones(multiplier));
end
end
## 9.199143 seconds (600 allocations: 15.646 GB, 9.05% gc time)
@time begin
for idx = 1:100
myones = [ones(multiplier*size(original,1)) ones(multiplier*size(original,1))];
end
end
## 12.746123 seconds (800 allocations: 26.822 GB, 14.86% gc time)
更新 作为对 David Sanders 评论的回应,以下是封装在函数中的测试。我在全局范围内进行测试的原因(我知道这不是正常的最佳实践)是因为在我看来对象可能会在全局范围内创建是非常合理的。
function kron_test(original, multiplier)
for idx = 1:100
expanded = kron(original,ones(multiplier));
end
end
function ones_test(original, multiplier)
for idx = 1:100
myones = [ones(multiplier*size(original,1)) ones(multiplier*size(original,1))];
end
end
## times given after first function call to compile
@time kron_test(original, multiplier); ## 11.107632 seconds (604 allocations: 15.646 GB, 23.98% gc time)
@time ones_test(original, multiplier); ## 15.849761 seconds (604 allocations: 26.822 GB, 33.50% gc time)
关于arrays - 有没有一种通过复制每一行来快速扩展矩阵 n 次的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38382039/