我有一个大小为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计算?
答案 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
的特殊内置函数(例如,nanmin
,nanmax
等)来实现此目的。
以下是查找行(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