如何在给定范围内获得大于x的元素?

时间:2014-12-31 12:27:44

标签: arrays matlab matrix

给定矩阵A,如何在特定范围内获得大于x的元素(及其索引)?

e.g。

A = [1:5; 2:6; 3:7; 4:8; 5:9]

A =

     1     2     3     4     5
     2     3     4     5     6
     3     4     5     6     7
     4     5     6     7     8
     5     6     7     8     9

例如,我希望所有大于5的元素出现在A(2:4,3:5)范围内。我应该得到:

元素:

6 , 6 , 7 , 6 , 7 , 8

指数:

14, 18, 19, 22, 23, 24

A(A>5)会给我所有大于5的条目。

A(2:4,3:5)会提供2:4,3:5范围内的所有元素。

我想要两者的组合。是否可能或唯一的方法是将所需范围放在另一个数组B中,然后才执行B(B>5)?显然这里有两个问题:我会丢失原始索引,而且速度会慢一些。我在很多矩阵上做这个。

3 个答案:

答案 0 :(得分:3)

代码。我正在尝试避免矩阵乘法,所以这看起来有点奇怪:

A = [1:5; 2:6; 3:7; 4:8; 5:9];

[r,c] = meshgrid(2:4,3:5);
n     = sub2ind(size(A), r(:), c(:));

indices = sort(n(A(n) > 5)); %'skip sorting if not needed'
values  = A(indices);

解释。该代码将下标的笛卡尔积转换为A矩阵中的线性索引。然后它选择尊重条件的索引,然后选择值。

然而,它很慢。

优化。根据LuisMendo的建议,可以通过使用手工线性索引计算替换基于sub2ind的线性索引计算来加速代码:

A = [1:5; 2:6; 3:7; 4:8; 5:9];

%'For column-first, 1-based-index array memory   '
%'layout, as in MATLAB/FORTRAN, the linear index '
%'formula is:                                    '
%'L = R + (C-1)*NR                               '
n = bsxfun(@plus, (2:4), (transpose(3:5) - 1)*size(A,1)); 

indices = n(A(n) > 5);
values  = A(indices);

答案 1 :(得分:2)

如果您只需要值(而不是索引),可以使用find的第三个输出和矩阵乘法来完成。但我不知道它是否比使用临时阵列更快:

[~, ~, values] = find((A(2:4,3:5)>5).*A(2:4,3:5));

假设您需要线性索引和值,那么如果阈值为正,您可以定义一个掩码。如果掩码可以定义一次并重用于所有矩阵(也就是说,如果所有矩阵的所需范围相同),这可能是一个好主意:

mask = false(size(A));
mask(2:4,3:5) = true;
indices = find(A.*mask>5);
values = A(indices);

答案 2 :(得分:0)

它有点笨重,但是:

R = 2:4;
C = 3:5;
I = reshape(find(A),size(A))

indicies = nonzeros(I(R,C).*(A(R,C)>5))
values = A(indicies)