如何在Julia中高效实现矩阵的对称填充(无依赖)
实现2D数组的对称填充(symmetric模式)
你需要实现的是类似numpy中pad函数的symmetric模式,该模式会沿着数组边界进行镜像反射(包含边界元素)。结合你已有的replicate模式实现,以下是高效的无依赖2D数组对称填充实现:
function padimagesymmetric(input, pad) m, n = size(input) p_row, p_col = pad # 生成行索引 if m == 1 row_indices = fill(1, m + 2*p_row) else # 上方填充:取原数组前m-1个元素的逆序,重复至所需长度 left_rows = repeat(reverse(1:m-1), ceil(Int, p_row/(m-1)))[1:p_row] middle_rows = 1:m # 下方填充:取原数组后m-1个元素的逆序,重复至所需长度 right_rows = repeat(reverse(2:m), ceil(Int, p_row/(m-1)))[1:p_row] row_indices = vcat(left_rows, middle_rows, right_rows) end # 生成列索引 if n == 1 col_indices = fill(1, n + 2*p_col) else # 左侧填充:取原数组前n-1个元素的逆序,重复至所需长度 left_cols = repeat(reverse(1:n-1), ceil(Int, p_col/(n-1)))[1:p_col] middle_cols = 1:n # 右侧填充:取原数组后n-1个元素的逆序,重复至所需长度 right_cols = repeat(reverse(2:n), ceil(Int, p_col/(n-1)))[1:p_col] col_indices = vcat(left_cols, middle_cols, right_cols) end return input[row_indices, col_indices] end
实现逻辑说明
- 当数组某一维度长度为1时,填充的所有元素都等于该维度的唯一元素;
- 对于长度大于1的维度:
- 上方/左侧填充:以边界元素为轴,镜像原数组的前
m-1个元素,重复至所需填充长度; - 中间部分:直接保留原数组的全部索引;
- 下方/右侧填充:以边界元素为轴,镜像原数组的后
m-1个元素,重复至所需填充长度;
- 上方/左侧填充:以边界元素为轴,镜像原数组的前
- 利用Julia内置的数组拼接与重复操作实现高效计算,避免循环带来的性能损耗。
内容的提问来源于stack exchange,提问作者Eric Johnson
相关产品推荐
相关产品推荐

