【问题标题】:Find the minimum non zero value in a matrix在矩阵中找到最小的非零值
【发布时间】:2012-06-29 08:12:53
【问题描述】:

我正在尝试找到一个 2d 数组,它表示 3d 数组中第 3 维的最小值。例如

a = floor(rand(10,10,3).*100); % representative structure
b = min(a,[],3); % this finds the minimum but also includes 0 

我尝试使用:

min(a(a>0),3) 

但这不正确吗?我想我可以对 a 的第三维进行排序,然后在 1:depth-1 内找到最小值 - 但这似乎不是最有效的方法?

有什么想法吗?

【问题讨论】:

  • 请注意,如果您排序,最小值是第二个(如果 matlab 索引从 0 开始,则索引 1)元素,您不必再找到 1:depth-1 的最小值。但是,是的,这仍然是低效的,必须有更好的方法。
  • 应该是min(a,[],3),否则取a和3中较小的一个
  • 感谢您指出 Jonas 的错字,我现在已经更正了。

标签: matlab multidimensional-array


【解决方案1】:

问题在于a(a>0) 返回一个线性数组,因此您最终会得到一个最小值,而不是具有最小值的二维数组。

获取非零值最小值的最安全方法是用Inf 屏蔽它们,这样零就不会干扰最小值的计算。

tmp = a;
tmp(tmp==0) = Inf;

b = min(tmp,[],3);

【讨论】:

  • 不幸的是,这对稀疏矩阵适得其反,因为为(大)稀疏矩阵中的所有零赋值可能非常昂贵。我意识到这不是 OP 的问题,而只是仅供参考。
【解决方案2】:

一种可能性是简单地使所有零值都很大。

例如,如果您知道没有任何元素会大于 1000,您可以使用

b = min(a+1000*(a==0),[],3)

【讨论】:

  • @Dan 我知道这是旧的,但是:不,不要使用 inf。 inf*0==NaN 所以此代码不适用于Inf。他应该使用(max(a(:))+1)
【解决方案3】:

只需将值为零的那些点分配为无穷大,因此最小答案始终不会计数为零.....就像 a(a==0)=inf; %然后数最小的一个 mineelement=min(a);

【讨论】:

    【解决方案4】:

    像这样从矩阵中删除零个元素:

        a = [10 2 0 4 5; 156 1.7 45 23 0 ];
        a(a == 0) = NaN;% not a number
        min(a(:))
        >> ans = 1.7
    

    【讨论】:

      猜你喜欢
      • 2016-01-14
      • 2020-11-29
      • 2012-07-30
      • 2013-11-20
      • 1970-01-01
      • 2021-04-27
      • 1970-01-01
      • 2020-05-09
      • 1970-01-01
      相关资源
      最近更新 更多