如何在julialang中查找元素子集的最大索引?

时间:2017-11-01 14:20:35

标签: julia

我有一个长度为A=[3, 5, 1, 2, 7, 9, 10, 2, 3]的数组length(A)=9和一个包含索引S的子集的1:9,例如S=Set([1, 3, 6, 8])。我想找到A超过S的最大值(值和索引)。也就是说,最大值为9,索引为6

我试着这样做

A = [3, 5, 1, 2, 7, 9, 10, 2, 3];
S = Set([1, 3, 6, 8]);
B = [if i in S A[i] else 0 end for i in 1:length(A)];
findmax(B);

但我觉得有一种更好,更聪明的方式。

4 个答案:

答案 0 :(得分:7)

怎么样?

julia> maximum((A[i],i) for i in S)
(9, 6)

这依赖于元组按字典顺序排序的事实。这只会迭代子集,因此当S的元素明显少于A时,它应该更快。

Dan Getz指出,

maximum是比findmax更好的选择。

答案 1 :(得分:5)

这更详细,但在我的电脑上大约是发电机解决方案(版本0.6)的2.5倍:

function mymax(A, S)
    val, ind = typemin(eltype(A)), -1
    for i in S
        val_ = A[i]
        if val_ > val
            val, ind = val_, i
        end
    end
    return val, ind
end

答案 2 :(得分:3)

如果<div class="modal fade" id="tableDivID" tabindex="-1" role="dialog" data-backdrop="static" data-keyboard="false"> <div class="modal-dialog" style="width:95%"> <div class="modal-content " style="margin-top: 20%;"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">&times;</span> </button> <h4 class="modal-title">Caption</h4> </div> <div class="modal-body min-height-400"> <div class="row"> <div class="col-sm-12"> <div id="tableId" style="width: 100%"></div> </div> </div> </div> </div> </div> </div> 不包含重复项(或者至少是最大值是唯一的),我发现以下内容更具可读性:

function populateTableData(){
  var data= [];
  for(i=0;i<10;i++){
   var row = {'id': i, 'sectionCode': 'hello', 'headerName': 'header'+i, 'amount': '123,123'};
   data.push(row);
   }

var columns = [
        {field: 'id',checkbox: true},
        {field: 'sectionCode', title:'Section Code',visible: false},
        {field: 'headerName', title:'Header Name'},
        {field: 'amount', title:'Amount',width: '30%', align:'right'}];

$("#tableId").bootstrapTable('destroy');
    $("#tableId").bootstrapTable({
        height: 350,
        checkboxHeader: true,
        columns: columns ,
        data: data
    });
}

A适用于生成器,因此不应有内存开销。如果julia> i = findfirst(A, maximum(A[i] for i in S)) 6 julia> A[i], i (9, 6) 很小,则maximum的大小占主导地位,无论如何你必须遍历它。

答案 3 :(得分:2)

如果你可以做更多的最大值:

function maximums(A,S) 
    maxvalue = maximum(A[i] for i in S)
    (maxvalue, [i for i in S if A[i]==maxvalue])
end

A = [3,3,3]
S = Set([1,3])
maximums(A, S)  # (3, [3, 1])

如果您想保留顺序而且Set不是S的必要类型,那么您可以使用unique函数:

S = unique([1,3])
maximums(A, S)  # (3, [1, 3])