1 引言
有时候会需要查找矩阵中某个元素的下标,很多人会第一时间想到find函数,但是find函数在使用的时候会存在一定缺陷。当然利用MATLAB矩阵元素的排列规则也是能够计算出行列数的,但是一旦变成三维矩阵,又需要重新写几行代码来适应三维矩阵的存储结构。因此这里介绍一个小技巧,能准确查找矩阵中第n个元素的下标。
2通常方法的不足
以MATLAB中实例为例子
假如我们需要查找X中的第5个元素存在的下面,通常情况大家可能会用以下方法:
(1)find(X==X(5))
但是显然对于此案例不行,因为有多个值与X(5)相等。
(2)find(X,5)
此方法同样不行,因为这样只是找到前五个非0元素的下标,一旦矩阵中有0,那么这个方法也不适用。
(3)raw, mod(5,size(X,1)); col=ceil(5/size(X,1))]
利用矩阵元素排列顺序的特性求出行列号,若要求第5个元素的行列号,需要除以X的行数并取余数。这个方法是比较可行的,但是对于三维矩阵来说,该代码就不适用了,需要重新写。
(4)最简单的方法?
Z=zeros(size(X));
Z(5)=1;[raw col]=find(Z==1);
生成一个与X完全一样的0矩阵,并对第5个元素赋值为1,这样就确保这个元素是独一无二的,再用find函数就完全可以避免方法(1)、(2)中的问题了。该方法同样适用于三维矩阵。
3讨论
MATLAB或许应该有这样一个可以帮助直接查找矩阵中第n个元素的下标的函数(但是我确实不知道,ind2sub),但是似乎简单的find函数并不能直接达到这个效果。如果有了解相关函数的同学们也可以分享一下。
本文重点还是分享一种求解思路,有点类似于小学奥数中没有计算器的情况下做一些快速的运算。也许以后经常会碰到这种函数没法满足自己需要的情况,这时候稍微变通的一种求解思路可以帮助简化代码以及计算方式。