2017-02-01 4 views
1
for i = 1:6 
    if data(i,1) == 1 
     disp(i) 
     m(i,:) = data(i,:) 
    end 
end 

上記コードデータファイルからデータの行と、行列Mを返します。追加行

ただし、data(i、1)== 1は特定のデータに対して4回trueですが、mは6行です。 mの行のうち2つは0で完全ですが、if文は4回だけ真です。

どうしてですか?

答えて

3

これは標準のMATLABです。

data(1,1)data(3,1) 1.

そしてm(1,:)=data(1,:)以降m(3,:)=data(3,:)であると仮定します。でも、m(2,:)については、m(3,:)と記入してあるので存在しなければなりません。 2のない3はありません!

あなたはdata(i,1) == 1その後行うのみのものを持っているmをしたい場合:

「なぜそれが起こっている」と答えて
m=[]; %create empty matrix 
for i = 1:6 
    if data(i,1) == 1 
     disp(i) 
     m= [m; data(i,:)]; % "append" to m 
    end 
end 
4

は、それはあなたの行列が同じサイズであるためですが、あなただけを条件を満たす行に値を割り当てます。したがって、他の行は0となります。

mを行単位で作成するか(この記事の最後を参照)、別の方法(私の回答)で作成する必要があります。


あなたは、コラムdataの1が1に等しい論理インデックス

% For creating m 
m = data(data(:, 1) == 1, :); 

% For displaying which indices satisfy your condition, one call to disp 
disp(find(data(:, 1) == 1)) 

これを分解、mdataの値に割り当てられている、とこれを行うことができますすべての列を表示します。

findは、ゼロ以外の要素のインデックスを返します。論理インデックスは01の配列を返します。したがって、条件を満たすすべての要素(および1)はfindでインデックスされます。

また、論理インデックスを作成した場合、後日のメンテナンスのために二度、より良い、それを使用することができ、あなたの条件の変更:

% create logical index 
idx = (data(:,1) == 1); 

% same as above but using idx 
m = data(idx, :); 
disp(find(idx)) 

ドキュメント

論理インデックス - https://uk.mathworks.com/help/matlab/matlab_prog/find-array-elements-that-meet-a-condition.html

find - https://uk.mathworks.com/help/matlab/ref/find.html


@ Anderの提案では、特定の行だけを追加することができ、マトリックスを構築する方法をよく示しています。しかし、この場合、ループは必要なく、条件がまったく必要ありません。

+0

Definetlyこのコードは私より優れています;) –

+0

@AnderBiguri Yoursは仕事をして、OPのコードについて...少なくとも何かをするためには1つ以上の方法を変更します:) – Wolfie