作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何使用 for
循环简化代码?
eta
和 T
是 6 阶张量数组,并且 size(eta) == size(T)
。
using InvertedIndices
one_to_N = [1:6;]
eta[:,1,1,1,1,1] = vec(sum(T, dims=one_to_N[Not(1)]))
eta[1,:,1,1,1,1] = vec(sum(T, dims=one_to_N[Not(2)]))
eta[1,1,:,1,1,1] = vec(sum(T, dims=one_to_N[Not(3)]))
eta[1,1,1,:,1,1] = vec(sum(T, dims=one_to_N[Not(4)]))
eta[1,1,1,1,:,1] = vec(sum(T, dims=one_to_N[Not(5)]))
eta[1,1,1,1,1,:] = vec(sum(T, dims=one_to_N[Not(6)]))
最佳答案
您也可以直接使用 sum!
编写,而不是创建总和然后将其复制到 eta
中。使用索引 1:1
而不是 1
制作 View 意味着这些维度不会被删除,因此 sum!
可以推断出要对哪些维度求和:
data = rand(Int8, 4,7,2); # originally T, with ndims(T)==6, reduced for clarity
eta = ones(4,7,2);
for dim in 1:ndims(data)
ind = ntuple(d -> d==dim ? (:) : (1:1), ndims(data))
sum!(view(eta, ind...), data)
end
这给出:
julia> eta
4×7×2 Array{Float64, 3}:
[:, :, 1] =
-1.0 -29.0 -581.0 118.0 -106.0 189.0 198.0
-100.0 1.0 1.0 1.0 1.0 1.0 1.0
468.0 1.0 1.0 1.0 1.0 1.0 1.0
-214.0 1.0 1.0 1.0 1.0 1.0 1.0
[:, :, 2] =
-130.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0
julia> dim = 2;
julia> ind = ntuple(d -> d==dim ? (:) : (1:1), ndims(data))
(1:1, Colon(), 1:1)
julia> view(eta, ind...)
1×7×1 view(::Array{Float64, 3}, 1:1, :, 1:1) with eltype Float64:
[:, :, 1] =
-1.0 -29.0 -581.0 118.0 -106.0 189.0 198.0
julia> sum(data, dims=(1,3))
1×7×1 Array{Int64, 3}:
[:, :, 1] =
80 -29 -581 118 -106 189 198
请注意,eta[1]
在这里被覆盖了几次,因此结果取决于操作的顺序,而不仅仅是取决于 data
数组。
关于julia - 如何在julia中指定数组的第i轴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65866612/
我是一名优秀的程序员,十分优秀!