在Julia中,是否有多个点强制相同的数组元素计数?

时间:2018-09-11 13:38:07

标签: c# matlab for-loop julia translate

所以我看这样的代码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是int数组

和助手article我想知道两件事:

  1. view”结果的大小是否与psi相同?如果是,那么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语言的理解与正确的结果有多远。

1 个答案:

答案 0 :(得分:1)

.*.+不需要其操作数具有相同的形状。如有必要并且尺寸匹配,可以广播。例如,如果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的大小应始终与psi的大小相同在第一维度。检查该Github存储库中的示例和其他代码,我认为是这种情况。 ixp仅用于更改psi的第一维的顺序。即使不是这样,也不会有什么大问题,因为如上所述只有两种可行的情况。