在 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
。
例如,让我们用 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
。