Matlab データの取得、前処理、統計、視覚化、次元削減
データの前処理 - MATLAB & Simulink - MathWorks China https://ww2.mathworks.cn/help/matlab/preprocessing-data.html
1. データ取得
1.1 Excelから取得
readtable() を使用する
例1:
最初にインポート情報を決定するには、spreadsheetImportOptions (名前、値)を使用します。
次に、opts.Name=Valueの形式で追加します。
% 工作簿: C:\Users\Hao\Desktop\程序_MATLAB数学建模方法与实践_卓金武等\Cha2\sz000004.xls
% 工作表: Sheet1
%% 设置导入选项并导入数据
opts = spreadsheetImportOptions("NumVariables", 8);%变量数8
%spreadsheetImportOptions允许指定 MATLAB® 如何从电子表格文件中导入表格数据
% 指定工作表和范围
opts.Sheet = "Sheet1";
opts.DataRange = "A1:H45";
% 指定列名称和类型
opts.VariableNames = ["Date", "DateNum", "Popen", "Phigh", "Plow", "Pclose", "Volum", "Turn"];
opts.VariableTypes = ["double", "double", "double", "double", "double", "double", "double", "double"];
% 导入数据
sz000004 = readtable("C:\Users\Hao\Desktop\程序_MATLAB数学建模方法与实践_卓金武等\Cha2\sz000004.xls", opts, "UseExcel", false);
%% 清除临时变量
clear opts
例2:
まず、spreadsheetImportOptionsオブジェクトを初期化します。
次に、opts.Name=Valueの形式を使用して1 つずつ追加します。
% 初始化 SpreadsheetImportOptions 对象
opts = spreadsheetImportOptions;
% 指定变量名称
opts.VariableNames = 'LastName';
% 变量类型
opts.VariableTypes = 'categorical';
% 数据起始单元格
opts.DataRange = 'A2';
% 使用导入选项预览文件中的八行数据
preview('patients.xls',opts)
oneVar = readtable('patients.xls',opts);
% 列出变量及大小和类型
whos oneVar
例3:
インポート情報を変数に格納し、
次に、spreadsheetImportOptions (名前、値)を使用してインポート情報を追加します。
% 变量数
numVars = 7;
% 变量名称
varNames = {'LastName','Gender','Age','Location','Height','Weight','Smoker'} ;
% 变量类型
varTypes = {'char','categorical','int32','char','double','double','logical'} ;
% 数据起始单元格
dataStartLoc = 'A2';
% 使用 spreadsheetImportOptions 函数和变量信息初始化导入选项对象 opts
opts = spreadsheetImportOptions('NumVariables',numVars,...
'VariableNames',varNames,...
'VariableTypes',varTypes,...
'DataRange', dataStartLoc);
% 使用导入选项预览文件中的八行数据
preview('patients.xls',opts)
% 使用 readtable 导入数据
T = readtable('patients.xls',opts);
% 列出变量及大小和类型
whos T
注:readtable
次の名前と値のペアのみがサポートされます。
テキストおよびスプレッドシートのパラメータ -
ReadVariableNames
、ReadRowNames
テキストパラメータのみ -
DateLocale
、Encoding
スプレッドシートパラメータのみ -
Sheet
、UseExcel
xlsread() --xlswrite()を使用します。
a=xlsread('C:\Coporation_evaluation.xlsx',2,'A2:I16')
% 'C:\Coporation_evaluation.xlsx' 表示读入Excel数据所在位置
% 2 表示位于sheet2
% 'A2:I16' 表示读入的数据范围
a=xlswrite('C:\Coporation_evaluation.xlsx',a,3,'B1:C5')
% 'C:\Coporation_evaluation.xlsx' 表示写入Excel工作簿所在位置,若不存在会自动创建
% a 表示待写入的数据
% 3 表示sheet3
% 'B1:C5' 表示写入Excel中的的具体位置
[data,textdata] = xlsread('D:\Desktop\xx.xls')、読み取られる内容
- ファイル パスを使用して Excel ファイルからデータを読み取り
D:\桌面\xx.xls
、そのデータを 2 つの変数data
とに格納しますtextdata
。- その中には、
xlsread()
Excel ファイル内のデータを読み取るために使用される MATLAB の組み込み関数があります。- 最初の入力パラメータは
'D:\桌面\aa.xls'
Excel ファイルのフル パスを示し、実際の状況に応じて変更できます。- 2 番目のパラメーターが空の場合、関数はデフォルトですべての数値データを読み取ります。(この例のように) 2 番目の出力パラメーター名を指定すると、関数は
textdata
Excel ファイル内のテキスト データを変数に保存します。
ファイル パスが の Excel ファイルがありD:\桌面\data.xlsx
、次のデータが含まれているとします。
あ | B | C | |
1 | 10 | 20 | ある |
2 | 30 | 40 | b |
次に、次の MATLAB コードを使用して、このファイル内の数値データとテキスト データを読み取ることができます。
[data, textdata] = xlsread('D:\桌面\data.xlsx');
上記のコードを実行すると、MATLAB は Excel ファイル内の数値データをdata
変数に格納し、テキスト データをtextdata
変数に格納します。この時点で、MATLAB コマンド ウィンドウにこれら 2 つの変数名を入力して、その内容を表示できます。
data =
10 20
30 40
textdata =
2×1 cell 数组
{2×1 cell}
{2×1 cell}
>> textdata{1}
ans =
'a'
>> textdata{2}
ans =
'b'
- MATLAB が Excel ファイル内のデータを正常に読み取り、対応する変数に保存したことがわかります。
- このうち、
textdata
変数は 2x1 のセル配列であり、各セルにはテキスト データの列が格納されます。 - 中括弧を使用すると、最初の列のテキスト データにアクセスする
{}
など、セルの内容にアクセスできます。textdata{1}
1.2 TXTから取得
load() を使用する
% 生成线性间距向量,返回包含 1 和 30 之间的 8(默认100)个等间距点的行向量
a=linspace(1,30,8);
save d:\exper.txt a -ascii;
b=load('d:\exper.txt')
% save d:\exper.txt a -ascii; 把a以ASCII码的形式存储在D盘的exper.txt中,若不存在会自动创建
% b=load('d:\exper.txt') 读取'd:\exper.txt'中的数据,并储存在变量b中
textread() を使用する
[A,B,C,...]=textread('filename','format',N,'headerlines',M)
% filename 表示txt文件名称
% format 表示所读取变量的字段格式
% N 表示读取的次数
% headerlines 表示从第M+1行开始读取
リテラル読み取りを使用して一致した文字を無視するhttps://blog.csdn.net/jk_101/article/details/106495696
[name,type,x,y,answer]=textread('D:t.txt','%s Type%d %f %n %s',2,...
'headerlines',1)
% 格式Type%d只显示%d,因为原数据为Type1,Type2,Type3,Type4
例えば:
mydata.dat の最初の行は次のとおりです。
Sally Type1 12.34 45 Yes
2 番目のフィールドに入力された文字を無視して、ファイルの最初の行を読み取ります。
[names, typenum, x, y, answer] = textread('mydata.dat', ...
'%s Type%d %f %d %s', 1)
戻る
names =
'Sally'
typenum =
1
x =
12.34000000000000
y =
45
answer =
'Yes'
fopen() fread() fclose() を使用します。
例:
.mファイル内の文字を読み取ります(txtファイルを読み取ることも可能です)
% 用函数fopen打开文件,r代表只读形式打开,w代表写入形式打开,a代表在文件末尾添加内容
fid=fopen('D:\CRM4.m','r'); % fid=fopen('D:\CRM4.m','w')/fid=fopen('D:\CRM4.m','a')
% 以字符形式读取整个文本
var=fread(fid,'*char');
% 将中文字段转换为相应的2字节代码,否则输出可能会乱码
var=native2unicode(var)
fclose(fid)
fprintf() を使用して情報を txt に書き込みます
fprintf('file','format',a1,a2...)
% file 表示文件路径
% format 表示数据写入类型
% a 表示要写入的数据内容
1.3 写真から理解する
%% 读取图片
clc, clear, close all
a1=imread('000.bmp');
% 获得像素矩阵行数列数
[m,n]=size(a1);
%% 批量读取图片
dirname = 'ImageChips'; % 'ImageChips'文件夹
files = dir(fullfile(dirname, '*.bmp'));
%% fuiifile用法
% f = fullfile('myfolder','mysubfolder','myfile.m')
% f = 'myfolder/mysubfolder/myfile.m'
%% dir用法
% dir name 列出与 name 匹配的文件和文件夹。如果 name 为文件夹,dir 列出该文件夹的内容。使用绝对
% 或相对路径名称指定 name。name 参数的文件名可以包含 * 通配符,路径名称可以包含 * 和 ** 通配符。
% 与** 通配符相邻的字符必须为文件分隔符。
a=zeros(m,n,19); % 创建全零数组19个m*n数组,共19张图片
pic=[];
for ii = 1:length(files)
filename = fullfile(dirname, files(ii).name);
a(:,:,ii)=imread(filename); % 将该图片信息读取到a的第ii个数组里
pic=[pic,a(:,:,ii)]; % 拼接图像
end
double(pic);
figure
imshow(pic,[])
% imshow(I,[low high]) 显示灰度图像 I,以二元素向量 [low high] 形式指定显示范围
% 若为[],使用 [min(I(:)) max(I(:))] 的显示范围。换句话说,I 中的最小值是黑色,最大值是白色
1.4 ビデオから取得
ビジョン ツールボックスの VideoFileReader を使用する
%% 读取视频数据
% 从视频文件中读取视频帧、图像和音频样本
videoFReader = vision.VideoFileReader('vippedtracking.mp4');
% 播放视频文件
videoPlayer = vision.VideoPlayer;
while ~isDone(videoFReader)
% 当来自有限数据源的数据取完时(通常是因为已读取所有数据),isDone(obj)返回true
% ~逻辑非
videoFrame = step(videoFReader); % 运行videoFReader算法,返回输出参数
step(videoPlayer, videoFrame); % 对videoFrame运行videoPlayer算法
end
release(videoPlayer); %释放资源
%% 设置播放方式
% 重置播放器
reset(videoFReader) % 将图形对象属性重置为其默认值
% 增加播放器的尺寸
r = groot; % r = groot 用于存储图形根对象的句柄。要使用圆点表示法设置根属性,首先必须存储句柄
scrPos = r.ScreenSize;
% Size/position is always a 4-element vector: [x0 y0 dx dy]
dx = scrPos(3); dy = scrPos(4);
videoPlayer = vision.VideoPlayer('Position',[dx/8, dy/8, dx*(3/4), dy*(3/4)]);
% 指定左下角和右上角的坐标
while ~isDone(videoFReader)
videoFrame = step(videoFReader);
step(videoPlayer, videoFrame);
end
release(videoPlayer);
reset(videoFReader)
%% 获取视频中的图像
videoFrame = step(videoFReader);
n = 0;
while n~=15
videoFrame = step(videoFReader);
n = n+1;
end
figure, imshow(videoFrame) % 获得第15张图像
release(videoPlayer);
Matlab での fopen 関数の使用法https://blog.csdn.net/jk_101/article/details/106494232
2. データの前処理
データ品質の 3 つの要素: 正確さ、完全性、一貫性 (一貫性のない形式など)
2 つの影響要素: 信頼性 (ユーザーがどの程度信頼しているか)、説明可能性 (理解しやすいか)
データ型変換https://zhuanlan.zhihu.com/p/217597511
欠損値の処理:
一般に、レコードは削除できますが、データは補完され、処理は行われません。https://blog.csdn.net/yunlinzi/article/details/90300113
推定可能なメソッド | メソッドの説明 |
平均/中央値/最頻値の代入 | 属性値の種類に応じて、 代入には属性値の平均/中央値/最頻値を使用します。 |
固定値を使用する | 欠落している属性値を定数に置き換えます。 たとえば、広州の工場で働く一般的な出稼ぎ労働者の「基本給」属性の空席値は、 2015年の広州の一般的な出稼ぎ労働者の給与基準である月額1895元を利用できる。 この方法は固定値を使用することです。 |
最も近い代入 | この属性値の代入で欠落しているサンプルに最も近いサンプルをレコード内で検索します。 |
回帰法 | 欠損値のある変数については、既存のデータとそれに関連する他の変数 (従属変数) のデータに基づいてフィッティング モデルを確立し、欠損属性値を予測します。 |
補間 | 補間方法は、既知の点を使用して適切な補間関数 f(x) を確立することです。 未知の値は、対応する点から得られる関数値 f(x,) に近似的に置き換えられます。 |
補間とフィッティング
補間とフィッティングの違いと関係
1.お問い合わせ
これらはすべて、実際に既知のデータのセットに基づいて、データ変化の法則を反映できる近似関数を構築します。
2.違い
補間問題は必ずしも近似関数の表現形式を求めるものではなく、未知点に対応する値を補間法によって求めるだけです。
データ フィッティングには、特定の近似関数の式が必要です。
補間法
選択される補間関数の種類によって近似効果が異なります。一般的に次のようなものがあります。
( 1 ) 最近傍アルゴリズム補間 (1 次元補間)
( 2 ) ラグランジュ補間アルゴリズム(1 次元補間)
( 3 ) バイリニア補間アルゴリズム(2次元補間)
( 4 )区分的線形補間(2次元補間)
( 5 ) 3次スプライン補間(2次元補間)
( 6 ) クリギング補間 (地理)
( 7 ) 逆距離重み補間アルゴリズム(地理)
- Matlab 実装: 区分的線形補間の実現には関数のプログラミングは必要なく、内部関数が提供されますhttps://blog.csdn.net/qq_36666756/article/details/81983385
- interp1 ( 1次元補間)
- interp2 (二次元)
- interp3 (三次元)
- インターン(n次元)
例: 1:00から12:00までの11時間以内、 1時間ごとに温度を測定します。測定された温度値は次のとおりです: 5、8、9、15、25、29、31、30、22、25 、27、24._ _ 1/10時間ごとの温度値を推定してみてください。
hours=1:12;
temps=[5 8 9 15 25 29 31 30 22 25 27 24];
h=1:0.1:12;
t=interp1(hours,temps,h,'spline');
plot(hours,temps,'+',h,t,hours,temps,'r:') %作图
xlabel('Hour'),ylabel('Degrees Celsius’)
%1.先在三维坐标画出原始数据,画出粗糙的温度分布曲线图.
%输入以下命令:
x=1:5;
y=1:3;
temps=[82 81 80 82 84;79 63 61 65 81;84 84 82 85 86];
mesh(x,y,temps)
%2.以平滑数据,在 x、y方向上每隔0.2个单位的地方进行插值.
再输入以下命令:
xi=1:0.2:5;
yi=1:0.2:3;
zi=interp2(x,y,temps,xi',yi,'cubic');
mesh(xi,yi,zi)
%画出插值后的温度分布曲面图.
例 ある海域のいくつかの点( x、y )で測定された水深z は次の表で与えられます。 船の喫水は5フィートであり、その場所は長方形の領域 ( 75 、200 ) × ( - 50 , 150 )ボートは進入しないでください。
%1.输入插值基点数据
%2.在矩形区域(75,200)×(-50,150)进行插值。
%3. 作海底曲面图
%4.作出水深小于5的海域范围,即z=5的等高线
%程序一:插值并作海底曲面图
x =[129.0 140.0 103.5 88.0 185.5 195.0 105.5 157.5 107.5 77.0 81.0 162.0 162.0 117.5 ];
y =[ 7.5 141.5 23.0 147.0 22.5 137.5 85.5 -6.5 -81 3.0 56.5 -66.5 84.0 -33.5 ];
z =[ 4 8 6 8 6 8 8 9 9 8 8 9 4 9 ];
x1=75:1:200;
y1=-50:1:150;
[x1,y1]=meshgrid(x1,y1);
z1=griddata(x,y,z,x1,y1,'v4');
meshc(x1,y1,z1)
%程序二:插值并作出水深小于5的海域范围。
x1=75:1:200;
y1=-50:1:150;
[x1,y1]=meshgrid(x1,y1);
z1=griddata(x,y,z,x1,y1,'v4'); %插值
z1(z1>=5)=nan; %将水深大于5的置为nan,这样绘图就不会显示出来
meshc(x1,y1,z1)
外れ値の処理:
- 外れ値は、データセット内のデータの大部分から逸脱したデータです。
- データ値から次のように表されます: データセット内のデータは平均から 2 標準偏差を超えて逸脱しています。
- 平均から 3 標準偏差を超えて逸脱するデータは、高度に異常な外れ値と呼ばれます。
ウェーブレット外れ値の抽出
通常、信号の突然変異点や特異点などの不規則な部分には重要な情報が含まれており、一般的な信号の特異点は次の 2 つの場合に分類できます。
- ある瞬間に信号の振幅が急激に変化し、信号が不連続になることを第 1 種の不連続点といいます。
- 信号は見かけ上滑らかで振幅に急激な変化はないが、信号の一次微分値が急激に変化し、一次微分値が不連続となる場合を第二種の不連続といいます。
- ウェーブレット解析を適用すると、信号内の突然変異点の位置、種類、大きさを検出できます。
例: 最初の種類の不連続性の検出
- この例では、信号の不連続性は、低周波数特性の正弦波信号の後半に、高周波数特性の正弦波信号が突然追加されたことによるものです。
- まず、フーリエ変換解析により信号を周波数領域で解析し、突然変異点が検出されないことを確認する。
- そこでウェーブレット解析を用いて解析したところ、信号振幅の急変位置、つまり高周波信号が加わった時点を正確に検出できることがわかりました。
load freqbrk;
x=freqbrk;%对信号进行傅里叶变换
f=fft(x,1024);
f=abs(f);
figure;
subplot(211);
plot(x);
subplot(212);
plot(f);
%使用db6小波进行6层
[c,l]=wavedec(x,6,’db6’);
figure(2);
subplot(811);
plot(x);
ylabel('x');
%对分解的第六层低频系数进行重构
a=wrcoef('a',c,l,'db6',6);
subplot(812);
plot(a);
ylabel('a6');
for i=1:6 %对分解的第6层到第1层的高频系数分别进行
d=wrcoef('d',c,l,'db6',7-i);
subplot(8,1,i+2);
plot(d);
ylabel(['d',num2str(7-i)]);
end
db6 ウェーブレットによる最初の種類の経験的突然変異の分解
2 番目の種類の db4 ウェーブレット分解
load nearbrk;
x=nearbrk;
%使用db4对信号进行2层分解
[c,l]=wavedec(x,2,‘db4’);
subplot(411);
plot(x);
ylabel('x');
%对分解的第六层低频系数进行重构
a=wrcoef('a',c,l,'db4',2);
subplot(412);
plot(a);
ylabel('a2');
for i=1:2%对分解的第2层到第1层的高频系数进行重构
a=wrcoef('a',c,l,'db4',3-i);
subplot(4,1,i+2);
plot(d);
ylabel(['d',num2str(3-i)]);
end
先頭と末尾の無効なデータを削除https://blog.csdn.net/FDA_sq/article/details/124250130
例: フライス送り込みプロセス
- 信号データの前半部分は、ミリング送り処理により信号が徐々に大きくなるデータとなっており、
- 対応する図のデータの最後には、エンドミルの後退により徐々に小さくなるデータがあります。
- この 2 つのデータは異常なミリング信号データであるため、手動で削除する必要がある無効なデータです。
原理:
- 各切断プロセスの開始時と終了時の無効データの臨界値、つまり各切断の元のデータの上位四分位値 Q を計算します。
- 元のデータの先頭は、フィードの終了位置として前から後ろに Q 以上の最初のデータを検索し、Q 未満の前の信号データをすべて削除します。
- 同様に、テールは工具後退開始位置として後ろから前に向かって Q 以上の最初のデータを探し、それ以降の Q 未満のデータはすべて削除されます。
%使用函数:
Q=quantile(x,y,z)
% x表示要求的矩阵或者向量;y的取值为表示要求的分位数,
% 如四分之一中位数0.25,四分之三中位数0.75等;
% z的取值为1或者2,若值为1则表示按列求四分位数,若为2表示按行求四分位数。
% Q为计算的上四分位值,常用大小为 (1,n).
%注:对于向量,
Q2=quantile(raw_data,0.75,1)
%等同于Q3 = prctile(raw_data,75)
重複値の削除https://blog.csdn.net/qq_43657442/article/details/118891434
独自の 機能を使って 、
重複行を直接削除
unique(A,'rows',setOrder)
%其中,setOrder 参数有两种取值,默认是’sorted’ 即去掉重复后排序输出(以第一个元素大小位依据),
%另一个是'stable' 代表去掉重复后按原来顺序输出
例
>> a=[1 0 1;1 0 1; 1 1 1;2 5 1; 1 1 1;0 1 2 ;0 4 5 ;0 1 2]
a =
1 0 1
1 0 1
1 1 1
2 5 1
1 1 1
0 1 2
0 4 5
0 1 2
>> unique(a,'row','stable')
ans =
1 0 1
1 1 1
2 5 1
0 1 2
0 4 5
>> unique(a,'row')
ans =
0 1 2
0 4 5
1 0 1
1 1 1
2 5 1
>>
列ごとに重複行を削除する
[C,ia,ic] = unique(dataRed(:,1:2),'rows'):
% 基于1、2列的数据查找dataRed中所有的唯一行。
% 指定三个输出以返回索引向量 ia 和 ic。
uA = dataRed(ia,:)
%使用 ia 对 dataRed 进行索引并检索包含前两列中元素的唯一组合的行。
dataRed(:,1:2)
dataRed
のすべての行の最初の 2 列が 選択されます 。これは通常、他の列に関係なく、データ内の特定の列の一意の組み合わせを見つけるために行われます。'rows'
この引数は、各行を比較するときに各行の順序を考慮するように MATLAB に指示するため、同じ値を同じ順序で含む行のみが等しいと見なされます。unique
最初の 2 列を行列として扱い、すべての一意の行の並べ替え結果を返す関数を実行します 。結果は、それぞれ 3 つの変数C
、 、ia
および に保存されますic
。
具体的には、出力パラメータには次のものが含まれます。
C
: 入力行列の一意のすべての行を最初に出現した順に含む行列。ia
: 入力行列内の選択された列の一意の行インデックスをすべて含むベクトル。入力行列の各行について、ia
の対応する要素は のC
対応する行のインデックスです。ic
: 入力行列と同じサイズのベクトル。 での位置を示す入力行列の各行のインデックスが含まれますC
。
dataRed
以下を含む行列があるとします。
dataRed = [1, 2, 3;
4, 5, 6;
7, 8, 9;
1, 2, 3;
4, 5, 6];
unique
関数 を呼び出します。
[C,ia,ic] = unique(dataRed(:,1:2),'rows');
MATLAB は次の結果を返します。
C =
1 2
4 5
7 8
ia =
1
2
3
ic =
1
2
3
1
2
つまり、dataRed
行列の最初の 2 列の組み合わせは(1, 2)
、 、(4, 5)
およびだけです(7, 8)
。
ia
ベクトルC
には行列内の行の位置が含まれます。
そして、ic
ベクトルは行列dataRed
内の行列の各行の位置を示しますC
。
matlab は空でない位置を見つけて重複データを削除/NaN を削除しますhttps://blog.csdn.net/qq_20784777/article/details/126480643?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default - 0-126480643-blog-118891434.235%5Ev35%5Epc_relevant_increate_t0_download_v2&spm=1001.2101.3001.4242.1&utm_relevant_index=3
空いていない場所を見つける
Matlab での Find() 関数の使用法 https://blog.csdn.net/qq_45767476/article/details/109081132
find() 関数
idx = find(isnan(data));
- ベクトルまたは行列内の NaN (Not-a-Number) 要素を含むすべての添字インデックスを検索するために使用されます。
- 具体的には、このステートメントは次の手順を実行します。
- isnan(data) は、data と同じサイズの論理配列を返します。この論理配列には、data の各要素が NaN であるかどうかに関する情報が含まれています。
- NaN の場合、この位置は 1 であり、それ以外の場合は 0 です。
- find() 関数は入力パラメータ内のゼロ以外の要素の添え字を取得するため、isnan(data) によって返される論理配列の場合、次のようになります。
- find() は、すべての 1 要素の位置を含む添字ベクトルを返します。
- したがって、最終結果は列ベクトル idx となり、データ内のすべての NaN 値の添字インデックスが含まれます。
idx = find(~isnan(data));
- NaN (Not-a-Number) 要素を含まないベクトルまたは行列内のすべての添字インデックスを検索するために使用されます。
- 具体的には、このステートメントは次の手順を実行します。
- isnan(data) は、data と同じサイズの論理配列を返します。この論理配列には、data の各要素が NaN であるかどうかに関する情報が含まれています。
- NaN の場合、この位置は 1 であり、それ以外の場合は 0 です。
- このステートメントでは、~ 演算子は論理配列を否定します。つまり、1 は 0 になり、0 は 1 になります。
- したがって、結果として得られる論理配列は、NaN ではないデータ内のすべての要素の位置を表します。
- find() 関数は入力引数のゼロ以外の要素の添字を取得するため、~isnan(data) によって返される論理配列の場合、次のようになります。
- find() は、すべての 1 要素の位置を含む添字ベクトルを返します。
- したがって、最終結果は列ベクトル idx となり、データ内のすべての非 NaN 値の添え字インデックスが含まれます。
たとえば、A
5 つの NaN 値を含む 5x5 行列があるとします。
これらの NaN 値がどこにあるかは、次のコマンドで確認できます。
A = [1 2 NaN 4 5;
6 NaN 8 9 10;
11 12 13 NaN 15;
16 17 18 19 NaN;
NaN 21 22 23 24];
idx = find(isnan(A))
結果
idx =
3
7
12
20
25
これは、A
行列の 3 番目、7 番目、12 番目、20 番目、および 25 番目の要素が NaN であることを意味します。
これらの非 NaN 値が存在する場所は、次のコマンドで見つけることができます。
A = [1 2 NaN 4 5;
6 NaN 8 9 10;
11 12 13 NaN 15;
16 17 18 19 NaN;
NaN 21 22 23 24];
idx = find(~isnan(A))
結果
idx =
1
2
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
21
22
23
24
isnan() 関数の使用法https://blog.csdn.net/Intangilble/article/details/83786589
isnan(A):
%判断数组的元素是否是NaN。(True for Not-a-Number.)
%用法说明:
B = isnan(A)
%返回一个与A相同维数的数组;
%若A的元素为NaN(非数值),在对应位置上返回逻辑1(真),否则返回逻辑0(假)。
例
(InF は正の無限大を表します。-InF は負の無限大を表します。NaN は非数値量を表します。)
>>isnan([pi NaN Inf -Inf])
ans =
1×4 logical 数组
0 1 0 0
[data in] = unique(data(:, n)):
b = unique(A)
b = unique(A,'rows')
[b,m,n] = unique(...)
%描述
%1、b = unique(A) 返回的是和A中一样的值,但是没有重复元素。产生的结果向量按升序排序。
%A可以是一个字符串的单元阵列。
%2、b = unique(A,'rows') 返回的是A中的唯一的行数。
%3、[b,m,n] = unique(...) 也返回索引向量m和n,使得B = A(M) 和 A= B(N).
%m的每一个元素是最大的下标,使得B = A(M). 对于行的组合,B = A(M,:) 和 A= B(N,:)