【问题标题】:Retaining and identifying elements in an array which satisfy a threshold in MATLAB保留和识别数组中满足 MATLAB 阈值的元素
【发布时间】:2016-04-25 02:38:28
【问题描述】:

我有一个由C_{ij} 表示的矩阵(大约 342 x 342),我想识别满足条件C_{ij} > rho 的所有索引 i,j,其中 rho 是某个固定值。我正在使用 MATLAB

例如,如果我将矩阵 C_{ij} 设为:

C = 1     0.7    0.8
    0.7   1      0.5
    0.8   0.5    1

而 rho = 0.6 那么满足条件 C_{ij} > 0.6 的索引是 i,j = 1,2 为 C_{11}=C_{22}=1C_{12}=C_{21}=0.7 但请注意,i,j=3 不满足这个条件,因为虽然 C_{13}=C_{31}=0.8, C_{23}=C_{32}=0.5

我不确定在 MATLAB 中如何/最好的方法是?

【问题讨论】:

  • [k,l]=find(C>rho);
  • 您的问题不清楚。在结果中包含或不包含给定对 i,j 的标准是什么? C 总是对称的吗?
  • @LuisMendo 我将标准读作“需要大于 rho”,C 是否对称并不真正相关,如果它是对称的,您可以使用 @987654334 @。我不确定这是否比简单地在整个矩阵上使用逻辑更快。
  • @Adriaan 嗯...你嫉妒雷的三个字母的答案,不是吗? :-)
  • 正方形子矩阵的左上角/右下角是否总是在对角线上,或者你可以有一个以C(2,1),C(3,2)为边界的子矩阵吗?

标签: matlab matrix threshold


【解决方案1】:
C = rand(342,342);
rho = 0.6;
res = C(C>rho); %// contains all values that are above the threshold
[row,col,val] = find(res); %// returns the indices.

row 会包含你的 i,col 你的 j,但我会提防 using i or j as a variableval 包含相应的值,但您可以省略它以释放 RAM,因为您也可以使用 C(row,col) 来获取值。

如果你的矩阵是对称的,你可以使用它:

[rowt,colt,val] = find(triu(C)>rho); %// find only in the upper triangle
row = [rowt;colt]; %// flip rows and columns to obtain all results
col = [colt;rowt]; %// flip rows and columns to obtain all results

供您编辑:

IdxR = find(diff(unique(rows))==1,1,'first');
IdxC = find(diff(unique(columns))==1,1,'first');
Result = C(1:IdxR,1:IdxC);

【讨论】:

  • "and I want to identify all indices i,j which satisfy the condition"
  • @AndrasDeak 根据他的头衔“保留和识别”,现在两者兼而有之
  • @Adriaan @AndrasDeak 是的,矩阵总是对称的。虽然我更喜欢一种不假设这一点的方法。也许我没有正确解释我的标准。以我最初的问题中的矩阵为例,第一个代码会将kl 标识为1、2 和3。但是,这将包括元素C(2,3)C(3,2),它们都是
  • @Ansh Adriaan 的回答没有给你C(3,2),但C(3,1) 给你。 是你的问题吗?然后你的不是单个元素,而是符合条件的完整矩形块。那是你要的吗? C(indexvector1,indexvector2) 给出的子矩阵?如果是,你需要重新表述你的问题,因为这是一个更困难的问题,需要不同的解决方案。
  • @Ansh Clarifications 应编辑到您的问题中。如果您的问题不独立且不明确,则应将其关闭。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-26
  • 2016-09-10
  • 2017-02-18
相关资源
最近更新 更多