行列から条件を指定して値を取り出す

20 visualizaciones (últimos 30 días)
Masa
Masa el 12 de Nov. de 2020
Comentada: Masa el 13 de Nov. de 2020
以下のような行列Aの2行目の要素で1が連続している時と0が連続しているときの1行目の値の差を取り表示したいですのです。[1 1 0 0] の一区切りならなんとかできるのですが以下に示す行列のように[1 1 0 0 1 1 0 0]と連続している部分が分かれている時それぞれの値をどのようにして求めればいいのかわかりません。
次のような行列があるとします。
A=
0 1 2 4 3 6 4 8 5 9 6 12
1 1 0 0 1 1 0 0 1 1 0 0
この時1が連続してる列の1行目の差(1-0, 6-3, 9-5)
B=
1 3 4
0が連続している列の1行目の差(4-2, 8-4, 12-6)
C=
2 4 6
というように求めたいのですがどのようにすればよいでしょうか。ご指導をお願いしたいです。

Respuesta aceptada

Akira Agata
Akira Agata el 12 de Nov. de 2020
もし、行列Aの2行目の要素で 1 (or 0) が偶数個連続している部分があり、かつ要素が 1 (or 0) の列のうち 2k 番目と 2k-1番目との差を取りたいということであれば、以下の方法で計算可能です。
A = [ 0 1 2 4 3 6 4 8 5 9 6 12; 1 1 0 0 1 1 0 0 1 1 0 0];
idx = A(2,:) == 1;
B = diff(A(1,idx));
B = B(1:2:end);
C = diff(A(1,~idx));
C = C(1:2:end);
  3 comentarios
Akira Agata
Akira Agata el 12 de Nov. de 2020
ご説明ありがとうございます。なるほど、理解しました。
それでは、以下のような方法ではいかがでしょうか。
% Example (最終結果が B = [2 2 6], C = [-1 4] となればOK)
A = [...
0 1 2 4 3 6 4 8 5 9 6 12;...
1 1 1 0 0 1 1 1 0 0 1 1];
% 1,0連続に対してグループ番号を付与
pt = [1 abs(diff(A(2,:)))];
group = cumsum(pt);
% グループ毎に、最後と最初の要素の差をとる
D = splitapply(@(x) x(end)-x(1), A(1,:), group);
% 1連続のグループ番号の結果のみを抽出
idx = A(2,:) == 1;
g1 = unique(group(idx));
B = D(g1);
% 0連続のグループ番号の結果のみを抽出
g2 = unique(group(~idx));
C = D(g2);
Masa
Masa el 13 de Nov. de 2020
ありがとうございます!
これがやりたかったです。
参考にさせて頂きます

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Logical en Help Center y File Exchange.

Etiquetas

Productos

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!