最近,需要用MATLAB处理一批数据,数据的格式如下:
如上图所示,在一个文本文件中存储着一个N行8列的矩阵,第一列的取值为-1,0,1.为了将所有含有这三个值的行分别提出出来。使用find函数应该是比较高效的。
find函数语法:
1. ind = find(X)
2. ind = find(X, k)
3. ind = find(X, k, 'first')
4. ind = find(X, k, 'last')
5. [row,col] = find(X, ...)
6. [row,col,v] = find(X, ...)
说明:
1. ind = find(X)
找出矩阵X中的所有非零元素,并将这些元素的线性索引值(linear indices:按列)返回到向量ind中。
如果X是一个行向量,则ind是一个行向量;否则,ind是一个列向量。
如果X不含非零元素或是一个空矩阵,则ind是一个空矩阵。
2. ind = find(X, k) 或 3. ind = find(X, k, 'first')
返回第一个非零元素k的索引值。
k必须是一个正数,但是它可以是任何数字数值类型。
4. ind = find(X, k, 'last')
返回最后一个非零元素k的索引值。
5. [row,col] = find(X, ...)
返回矩阵X中非零元素的行和列的索引值。
这个语法对于处理稀疏矩阵尤其有用。
如果X是一个N(N>2)维矩阵,col包括列的线性索引。
例如,一个5*7*3的矩阵X,有一个非零元素X(4,2,3),find函数将返回row=4和col=16。也就是说,(第1页有7列)+(第2页有7列)+(第3页有2列)=16。
6. [row,col,v] = find(X, ...)
返回X中非零元素的一个列或行向量v,同时返回行和列的索引值。
如果X是一个逻辑表示,则v是一个逻辑矩阵。
输出向量v包含通过评估X表示得到的逻辑矩阵的非零元素。
根据如上的语法原理编写代码如下:
function result = example(dataPath)
%dataPath为data的路径
[pathstrssim, namessim, extssim] = fileparts(dataPath);
%读取数据
[Choice a b c d e f g ] =...
textread(dataPath,'%f%f%f%f%f%f%f%f%f%f%f');
tempMat = [Choice a b c d e f g];
%计算矩阵的总数
total = size(Choice,1);
tie = find(tempMat(:,1) == 0);
non_tie = total - size(tie,1);
[Lrow,Lcol V] = find(tempMat(:,1) == -1);
LeftMat1 =tempMat(Lrow,:);
[Rrow,Rcol V] = find(tempMat(:,1) == 1);
RrowMat1 =tempMat(Rrow,:);
result = [LeftMat1;RrowMat1];
end