给定矩阵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)
?显然这里有两个问题:我会丢失原始索引,而且速度会慢一些。我在很多矩阵上做这个。
答案 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)