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回だけ真です。
どうしてですか?
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回だけ真です。
どうしてですか?
これは標準の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
は、それはあなたの行列が同じサイズであるためですが、あなただけを条件を満たす行に値を割り当てます。したがって、他の行は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))
これを分解、m
はdata
の値に割り当てられている、とこれを行うことができますすべての列を表示します。
find
は、ゼロ以外の要素のインデックスを返します。論理インデックスは0
と1
の配列を返します。したがって、条件を満たすすべての要素(および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の提案では、特定の行だけを追加することができ、マトリックスを構築する方法をよく示しています。しかし、この場合、ループは必要なく、条件がまったく必要ありません。
Definetlyこのコードは私より優れています;) –
@AnderBiguri Yoursは仕事をして、OPのコードについて...少なくとも何かをするためには1つ以上の方法を変更します:) – Wolfie