2016-09-12 6 views
0

私は、さまざまな実験条件のために、共通のX変数(XThompsons)ではなく、さまざまなY変数(YCounts)を持つ異なる計測器からの2組のデータを持っています。データは、以下の例のようになります。テーブル行の値をペアで削除するにはどうすればよいですか?たとえば、いずれかの列が0.01未満の場合、行を削除するにはどうすればよいですか?

[Table1] 
XThompsons | YCounts (1) | YCounts (2) | YCounts (3) | .... | .... 
------------------------------------------------------------------ 

[Table2] 
XThompsons | YCounts (1) | YCounts (2) | YCounts (3) | .... | .... 
------------------------------------------------------------------ 

私はこのようなもので、2つのデータセットを持っているとき、私は表1から単一Y-の列情報を取得し、すべてのY-の列にいくつかの計算を行うためのスクリプトを書かれています表2に示す。しかし、2つの表の列を比較するとき、いずれかの列に特定のしきい値(0.10)の値がある場合は、その値を削除します。例では、私は列のいずれかが、私はMatlabのでこれを実行するにはどうすればよい0.10以下

XThompsons | Table1.YCounts(1) | Table2.YCounts(2) 
-------------------------------------------------- 
    1    1.00     0.50 
    2    0.22     0.12 
    3    0.29     0.14 
    4    0.29     0.09   (delete row) 
    5    0.11     0.49 
    6    0.02     0.83   (delete row) 

を含む値を持っているので、行4行と6を削除したいの下に?私の現在のコードは以下の通りです。私は最初に各テーブル行を配列に変換します。どうすればY < 0.10行を削除すればいいのですか?

datax = readtable('table1.xls'); % Instrument 1 
datay = readtable('table2.xls'); % Instrument 2 
SIDATA = []; 

for idx=2:width(datay); 

    % Read the indexed column of datax (instrument 1) then normalize to 1 
    x = table2array(datax(:,idx)); 
    x = x ./ max(x); 

    % Read indexed column of datay (instrument 2) and carry out loop 
    for idy=2:width(datay); 

     % Normalize y data to 1 
     y = table2array(datay(:,idy)); 
     y = y ./ max(y); 

     % Calculate similarity index (SI) at using the datax index for all collision energies for datay 
     xynum = sum(sqrt(x) .* sqrt(y)); 
     xyden = sqrt(sum(x) .* sum(y)); 
     SIDATA(idy,idx) = (xynum/xyden); 
    end 

end 

助けていただければ幸いです。 ありがとう!

+0

'DATAX = DATAX *(DATAX> 0.1);'この意志の要素ごとの乗算 'そのdatax''全ての真理値表によってdatax'は0.1よりも大きいので、何0.1未満の意志によって0を掛けて0になります。これがうまくいくなら私に知らせてください –

答えて

4

一般に、値をループスルーして値を切り捨てるときに、行列の最後から1に増やしたい場合は、この方法では、行を削除するとスキップしません。 (2行目を削除して3行目に進んだ場合は、3行目のデータはスキップします)。私に

は、これを行うための最も簡単な方法は、すべてのデータが列で、1つのマトリックスAにある場合、Y1 Y2は、

APruned = A((A(:,1) > 0.1) & (A(:,2) > 0.1),:) 

これは行列を取ることである行を見つけたところY1> 0.1 Y2> 0.1である行を見つけ出し、重複を見つけて、これらの両方が真であるA内の行のみを出力します。

You should read about logical indecies for more on this topic

EDIT:あなたは、要素単位の演算を使用して、以前のコードをクリーンアップすることができように見えます。

A = [datax./max(datax) datay./max(datay)]; 
+0

コードラインを追加していただきありがとうございます。@rayryeng –

+0

問題ありません。スタックオーバーフローへようこそ! – rayryeng

+0

これはまさに私が探している洞察です!コーディングのMATLABでもう少し読む予定です。私の訓練は分析化学者であるが、大きなデータセットを扱うのは少し難しかった。私は大学院では私の顧問は、コードを使用する代わりに大量のデータを手作業でバレルする必要があると思っていました(大学生=多くの時間、業界専門=たくさんのお金)。 –

関連する問題