在 Julia 中,多个点会强制计算相同的数组元素吗?

In Julia do multiple dots force same array elements count?

所以我看这样的代码code:

vx = angle.(
    conj.(psi1).*view(psi1, ixp,:,:) .+
    conj.(psi2).*view(psi2, ixp,:,:)
);

其原始matlab版本:

vx = angle(conj(psi1).*psi1(ixp,:,:) ...
                  +conj(psi2).*psi2(ixp,:,:));

psi 是复数的 3d 数组,ixp 是整数数组

还有帮手 article 我想知道两件事:

  1. 是与 psi 大小相同的“view”结果吗?如果是,那么 view 的重点是什么?
  2. 如果不是,这个表达式如何在 [i,j,k]for 循环项中展开?

我尝试了什么: 我试着把它翻译成 CSharp,得到了这样的东西:

//fassuming psi are a square
double[,,] vx = new double[psi1.Length,psi1[0].Length,psi1[0][0].Length];

for (int index1 = 0; index1 < psi1.Length; ++index1) {
    for (int index2 = 0; index2 < psi1[index1].Length; ++index2) {
        for (int index3 = 0; index3 < psi1[index1][index2].Length; ++index3) {
            var c1 = Complex.Conjugate(psi1[index1][index2][index3]);
            var c2 = Complex.Conjugate(psi2[index1][index2][index3]);
            var mul1 = psi1[index1][index2][ixp[index3]];
            var mul2 = psi1[index1][index2][ixp[index3]];
            var summ = (c1 * mul1 + c2 * mul2);
            var result = summ.Phase;
            vx[index1, index2, index3] = result;
        }
    }
}

现在我想知道我对 Julia 语言的理解离正确结果还有多远。

.*.+ 不要求其操作数形状相同。如果有必要并且有匹配的维度,他们可以广播。例如,如果 ixp 是一个包含 单个条目 的数组,该行的计算仍然应该没有错误。请参阅以下示例:

julia> a = rand(1:5, 4, 4, 2)
4×4×2 Array{Int64,3}:
[:, :, 1] =
 1  4  3  5
 2  1  1  1
 3  4  1  2
 3  5  1  3

[:, :, 2] =
 4  4  1  5
 3  4  4  4
 5  3  2  3
 5  3  4  4

julia> a[[1], :, :]
1×4×2 Array{Int64,3}:
[:, :, 1] =
 1  4  3  5

[:, :, 2] =
 4  4  1  5

julia> a .* a[[1], :, :]
4×4×2 Array{Int64,3}:
[:, :, 1] =
 1  16  9  25
 2   4  3   5
 3  16  3  10
 3  20  3  15

[:, :, 2] =
 16  16  1  25
 12  16  4  20
 20  12  2  15
 20  12  4  20

julia> a .* a[[1,1,1,1], :, :] # should give the same results as the prev. command
4×4×2 Array{Int64,3}:
[:, :, 1] =
 1  16  9  25
 2   4  3   5
 3  16  3  10
 3  20  3  15

[:, :, 2] =
 16  16  1  25
 12  16  4  20
 20  12  2  15
 20  12  4  20

生成的 view 的大小取决于索引参数 ixp。如果 ixp 的大小与 psi 的第一个维度的大小相同,则生成的视图将与 psi 的形状相同,但在第一个维度中的顺序可能不同因为 ixp 可能是 [2,3,4,1] 或 [2,3,1,1]。如果是这种情况,那么 行为与您的 C# 代码 中的行为相同。另一种情况下,此行仍应无错误地进行评估,即 ixp 是单个条目数组,其行为与上述代码段相同。如果 ixp 是单个条目,则结果将与相同条目重复的次数与 psi 的第一个维度的大小相同(如上面代码段的最后一个命令所示)。因此,由于您实现了第一种情况,因此也可以轻松实现另一种情况(单个 ixp 条目)中的行为。

ixp的其他尺码,由于DimensionMismatch,应该会出现错误。

您的 C# 代码似乎正确地实现了第一种情况下的行为。

如果您正在尝试将这个 Julia 项目翻译成另一种语言,那么如果您有更多关于潜在问题的信息可能会有所帮助也许 ixp 应该始终与 [=17 的大小相同=] 在第一个维度。检查 Github 存储库中的示例和其他代码,我认为是这样的。 ixp 仅用于更改 psi 的第一个维度的顺序。即使不是,也没有什么大问题,因为上面提到的只有两种可行的情况。