【问题标题】:Scilab: How to find first 1 in each column without loopsScilab:如何在没有循环的情况下在每列中找到前 1
【发布时间】:2013-06-21 16:01:41
【问题描述】:

我试图在不使用 for 或一段时间的情况下找到矩阵每一列中的第一个 1。说我有

-->A
 A  =

    1.    0.    0.    0.  
    0.    0.    1.    1.  
    1.    0.    1.    1.  
    1.    1.    0.    0. 

然后我想获得[1,4,2,2](我可以假设每列的某处总是有一个 1)。问题是当我使用 find(A) 时,它给了我[1,3,4,8,10,11,14,15]

有人告诉我不要使用循环,而是使用矩阵运算,因为 scilab 可以更好地处理最后一个。

提前谢谢你!

【问题讨论】:

    标签: find scilab


    【解决方案1】:

    有了这么小的矩阵,for 循环的性能可能足够快,而且可能更具可读性。但是避免使用 for 循环的一种解决方案可能如下。

    //Find all rows and cols of the ones in A
    [row,col] = find(A);
    
    //Get all row positions that are in a new column index
    disp( row( find([1,diff(col)]) ));
    

    我认为更易读的解决方案如下:

    //For each column
    for col=1:4
    
       //Find only the first occurence
       disp(find(A(:,col),1));
    
    end
    

    如前所述,具有如此小的矩阵可读性应该是更高的优先级。您可以通过profiling 衡量两种(或其他)解决方案的性能。

    如果您想了解更多关于一些性能增强技术的信息,请查看here

    【讨论】:

    • 谢谢,这正是我想做的。事实上,我想要在其中执行此类搜索的矩阵 A 要大得多,所以我希望 scilab 能够利用其在矢量化操作中的更高效率。
    猜你喜欢
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多