在 Julia 中制作 n 维对角线张量

Make n dimensional diagonal tensor in Julia

例如,让我们用 a[i][j][k] 表示 3d 张量的第 ijk 个元素。可以说 3d 张量在每个维度上都具有相同的大小。然后我想用 constant[i] 填充 a[i][i][i] for i 从 1 到 n。我希望所有其他元素都为 0。做一个 for 循环是我唯一的方法吗?

你可以使用理解:

a = [i==j==k ? constant[i] : 0.0 for i=1:n, j=1:n, k=1:n]

如果 a 已经存在(例如 a = zeros(n, n, n)),您可以使用以下函数来索引主对角线,它应该适用于任何维度(以及非对称情况) :

diagind(A::AbstractArray{T,N} where T) where N = CartesianIndex.(fill(1:minimum(size(A)), N)...)

那你就可以简单的广播:

a[diagind(a)] .= constant

如果输入始终可以假设为对角线,minimum(size(A)) 当然可以仅替换为 N