【问题标题】:MATLAB: I want to threshold a matrix, based on thresholds in a vector, without a for loop. Possible?MATLAB:我想根据向量中的阈值对矩阵进行阈值处理,而不需要 for 循环。可能的?
【发布时间】:2014-01-27 16:05:27
【问题描述】:

假设我有以下内容:

M = randn(10,20);
T = randn(1,20);

我想通过T 的每个条目对M 的每一列设置阈值。例如,查找大于T(1)M(:,1) 的所有元素的所有索引。查找M(:,2) 中大于T(2) 的所有元素的所有索引,等等。

当然,我想在没有 for 循环的情况下执行此操作。这可能吗?

【问题讨论】:

    标签: matlab matrix indexing find


    【解决方案1】:

    你可以像这样使用bsxfun

    I = bsxfun(@gt, M, T);
    

    那么I 将是size(M)M(:,i) > T(i) 的逻辑矩阵。

    【讨论】:

    • 啊,太棒了 - 我不知道这存在! :-)
    • 我也很久没有.. :)
    • arrayfuncellfunbsxfunspfun 都是允许您执行一些非常有趣的操作来代替可怕的 for 循环的函数
    【解决方案2】:

    你可以使用bsxfun 来做这样的事情,但它可能不会比 for 循环快(更多关于这个)。

    result = bsxfun(@gt,M,T)
    

    这将进行元素比较,并返回一个逻辑矩阵,指示由第一个参数控制的关系。我在下面发布了代码以显示直接比较,表明它确实返回了您正在寻找的内容。

    %var declaration
    M = randn(10,20);
    T = randn(1,20);
    % quick method
    fastres = bsxfun(@gt,M,T);
    
    % looping method
    res = false(size(M));
    for i = 1:length(T)
        res(:,i) = M(:,i) > T(i);
    end
    
    % check to see if the two matrices are identical
    isMatch = all(all(fastres == res))
    

    此功能非常强大,可用于帮助加快进程,但请记住,只有在有大量数据的情况下才会加快速度。 bsxfun 必须做一些后台工作,这实际上会导致它变慢。

    如果您有几千个数据点,我只建议使用它。否则,传统的 for 循环实际上会更快。通过更改 MT 变量的大小来亲自尝试一下。

    【讨论】:

    • 没问题。这都是关于学习,这使得这样一个合适的用户名:)
    【解决方案3】:

    您可以复制阈值向量并使用矩阵比较:

    s=size(M);
    T2=repmat(T, s(1), 1);
    M(M<T2)=0;
    Indexes=find(M);
    

    【讨论】:

      猜你喜欢
      • 2020-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-24
      • 2021-02-10
      • 1970-01-01
      相关资源
      最近更新 更多