arrays - 有没有一种通过复制每一行来快速扩展矩阵 n 次的方法?

标签 arrays matlab multidimensional-array julia

例如,[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/

相关文章:

c - 以下 C 程序的输出是什么?

ruby - 命令行Matlab中的vi输入模式?

Java:计算二维数组中的出现次数并输出一维数组中的结果

php - 获得给定数组中组合总和的最低价格

c - 二维数组与 malloc 玩把戏

java - 如何使用 Java ByteBuffer 处理负 int

C 突然弄乱了二维数组中的值

ruby - 检查整数数组是否在 Ruby 中递增

matlab - 从图像中提取正弦曲线

python - 我正在尝试将我的 matlab 代码转换为 python 以获得自适应高斯求积