在 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 我想知道两件事:
- 是与 psi 大小相同的“
view
”结果吗?如果是,那么 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 语言的理解离正确结果还有多远。
.*
和 .+
不要求其操作数形状相同。如果有必要并且有匹配的维度,他们可以广播。例如,如果 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
的第一个维度的顺序。即使不是,也没有什么大问题,因为上面提到的只有两种可行的情况。
所以我看这样的代码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 我想知道两件事:
- 是与 psi 大小相同的“
view
”结果吗?如果是,那么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 语言的理解离正确结果还有多远。
.*
和 .+
不要求其操作数形状相同。如果有必要并且有匹配的维度,他们可以广播。例如,如果 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
的第一个维度的顺序。即使不是,也没有什么大问题,因为上面提到的只有两种可行的情况。