如何在Julia中跨行查找最小非零元素列的索引?
我在Julia中有一个如何在Julia中跨行查找最小非零元素列的索引?,julia,Julia,我在Julia中有一个nxm数组{Int64,2}。我想找出每一行中,最小元素列的索引不是零。如果行为零,则返回0 例如,对于n=10和m=2和 julia> A 10×2 Array{Int64,2}: 2 0 1 1 8 7 0 0 3 8 0 0 0 0 2 4 5 1 6 0 我想回去 julia> B 10-element Array{Int64,1}: 1 1 2 1 1 1 1 1 2 1 我所做的是: B
nxm数组{Int64,2}
。我想找出每一行中,最小元素列的索引不是零。如果行为零,则返回0
例如,对于n=10
和m=2
和
julia> A
10×2 Array{Int64,2}:
2 0
1 1
8 7
0 0
3 8
0 0
0 0
2 4
5 1
6 0
我想回去
julia> B
10-element Array{Int64,1}:
1
1
2
1
1
1
1
1
2
1
我所做的是:
B = zeros(Int64, n);
for i in 1:n
B[i] = findmin(A[i, :])[2];
end
但当某一行中有零时,这不起作用…大多数函数(sum、minimum、find、findmin
等)使用dims
关键字参数来指定执行所述操作的轴:
前
将实际最小值和位置作为两个单独的数组返回
因此:
笛卡尔索引有点奇怪,但显然经常用于多维索引大多数函数(sum、minimum、find、findmin
等)使用dims
关键字参数来指定执行上述操作的轴:
前
将实际最小值和位置作为两个单独的数组返回
因此:
笛卡尔索引有点奇怪,但显然经常用于多维索引您也可以使用
mapslices
并指定适用于单行的函数
首先,建立一个矩阵:
julia> A = [2 1; 1 2; -1 -2; 0 0; 0 5; 10 0]
6×2 Array{Int64,2}:
2 1
1 2
-1 -2
0 0
0 5
10 0
创建一个函数,用于查找每行最小非零元素的索引:
function findmincol(row)
# handle the special case when all elements are 0
if all(row .== 0)
return 0
end
# check the number of zero elements
length_zero = sum(row .== 0)
# find the min among non-zero elements
filter!(x -> x != 0, row)
return findmin(row)[2] + length_zero
end
然后可以使用mapsicles
将findmincol
函数映射到A
的每一行:
mapslices(findmincol, A, dims=2)
这为您(我认为是)提供了正确的解决方案:
6×1 Array{Int64,2}:
2
1
2
0
2
1
您还可以使用
mapslices
并指定适用于单行的函数
首先,建立一个矩阵:
julia> A = [2 1; 1 2; -1 -2; 0 0; 0 5; 10 0]
6×2 Array{Int64,2}:
2 1
1 2
-1 -2
0 0
0 5
10 0
创建一个函数,用于查找每行最小非零元素的索引:
function findmincol(row)
# handle the special case when all elements are 0
if all(row .== 0)
return 0
end
# check the number of zero elements
length_zero = sum(row .== 0)
# find the min among non-zero elements
filter!(x -> x != 0, row)
return findmin(row)[2] + length_zero
end
然后可以使用mapsicles
将findmincol
函数映射到A
的每一行:
mapslices(findmincol, A, dims=2)
这为您(我认为是)提供了正确的解决方案:
6×1 Array{Int64,2}:
2
1
2
0
2
1
如果一行中有负值,这个函数应该怎么做?如果有一些零和一些负值,它应该返回最小非零元素的索引。如果全部为零,它应该返回0。如果一行中有负值,该函数应该做什么?如果有一些零和一些负值,它应该返回最小非零元素的索引。如果全部为零,则应返回0。