【问题标题】:Condition for columns based on same index as vector基于与向量相同索引的列的条件
【发布时间】:2015-11-11 07:46:46
【问题描述】:

我试图根据向量N 中相同索引i 的值,根据原始矩阵的每一列M(:,i) 特定的条件来获取逻辑矩阵,即是,N(i)

我在网上查过这个,但找不到类似的东西。必须有一种简单而干净的方式来做到这一点。

M =

     3    -1   100     8
   200     2   300     4
   -10     0     0   400

N =

     4     0    90     7

而我想要的解决方案是,对于M(:,i) 的每一列,小于N(i) 的值:

     1     1     0     0
     0     0     0     1
     1     0     1     0

【问题讨论】:

    标签: matlab matrix conditional-statements


    【解决方案1】:

    这是bsxfun 的标准用例:

    O = bsxfun(@lt, M, N)
    

    这里@lt 正在调用“小于”函数,即它是< 运算符的函数句柄。然后bsxfun 将通过将函数@lt 应用于M 的每一行和N 的整个行来沿其单例维度“扩展”N

    请注意,您可以使用 for-loop 轻松实现相同的目标:

    O = zeros(size(M));
    for row = 1:size(M,1)
        O(row,:) = M(row,:) < N;
    end
    

    或者使用repmat:

    O = M < repmat(N, size(M,1), 1);
    

    但在 MATLAB 中,bsxfun 通常是最有效的。

    【讨论】:

    【解决方案2】:

    使用arrayfun 将比较应用于每个列和索引对的可能的两行解决方案:

    T = arrayfun(@(jj)M(:,jj) < N(jj), 1:numel(N), 'UniformOutput', false);
    result = cat(2,T{:});
    

    编辑:当然,bsxfun 解决方案效率更高。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-10
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 2021-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多