所以我看这样的代码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我想知道两件事:
view
”结果的大小是否与psi相同?如果是,那么view
的意义在这里吗?[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语言的理解与正确的结果有多远。
答案 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
的第一维的顺序。即使不是这样,也不会有什么大问题,因为如上所述只有两种可行的情况。