在matlab中查找数组元素之间最大间隔的行

时间:2013-01-03 12:21:55

标签: arrays matlab

我有一个大小为m x n的数组。每行有n个元素,显示一些概率(在0和1之间)。我想找到其元素之间存在最大差异的行,而如果它的非零元素也更大则会更好。

例如在数组Arr中:

Arr = [0.1   0     0.33   0     0.55  0;
       0.01  0     0.10   0     0.2   0;
       1     0.1   0      0     0     0;
       0.55  0     0.33   0     0.15  0;
       0.17  0.17  0.17   0.17  0.17  0.17]

最佳行将是第3行,因为它具有更多具有更大值的不同值。如何使用Matlab计算?

2 个答案:

答案 0 :(得分:4)

您似乎正在寻找具有最大standard deviation的行,这基本上是衡量值与平均值之间的差异的度量。

如果要忽略零元素,请使用Shai的有用建议将零元素替换为NaN。实际上,MATLAB的一些内置函数允许忽略它们:

Arr2 = Arr;
Arr2(~Arr) = NaN;

为了找到标准偏差,我们将使用nanstd(不是std,因为它不会忽略行中的NaN值) ie 2 nd 维度:

nanstd(Arr2, 0, 2)

要找到最大的标准偏差及其对应的行索引,我们将应用nanmax并获取两个输出变量:

[stdmax, idx] = nanmax(nanstd(Arr2, 0, 2));

现在idx保持所需行的索引。

实施例

让我们在您在问题中提供的输入上运行此代码:

Arr = [0.1   0     0.33   0     0.55  0;
       0.01  0     0.10   0     0.2   0;
       1     0.1   0      0     0     0;
       0.55  0     0.33   0     0.15  0;
       0.17  0.17  0.17   0.17  0.17  0.17];

Arr2 = Arr;
Arr2(~Arr) = NaN;
[maxstd, idx] = nanmax(nanstd(Arr2, 0, 2))

idx =
    3

请注意,第3行中的值与第1行中的值相差很多,因此行#3的标准偏差更大。这也与您的评论相对应:

  

... ergo一行有3个零和3个非零但是接近的值比有4个零和2个非常不同的值的行差。

出于这个原因,我相信在这种情况下3确实是正确答案。

答案 1 :(得分:0)

您似乎希望忽略矩阵中的0。您可以通过将它们设置为NaN并继续使用忽略NaN的特殊内置函数(例如,nanminnanmax等)来实现此目的。

以下是查找行(ri)的示例代码,其中最小(非零)响应与最大响应之间的差异最大:

nArr = Arr;
nArr( Arr == 0 ) = NaN; % replace zeros with NaNs
mn = nanmin(nArr, [], 2); % find minimal, non zero response at each row
mx = nanmax(nArr, [], 2); % maximal response
[~, ri] = nanmax( mx - mn ); % fid the row with maximal difference