行列から条件を指定して値を取り出す
12 次查看(过去 30 天)
显示 更早的评论
以下のような行列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
というように求めたいのですがどのようにすればよいでしょうか。ご指導をお願いしたいです。
0 个评论
采纳的回答
Akira Agata
2020-11-12
もし、行列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 个评论
Akira Agata
2020-11-12
ご説明ありがとうございます。なるほど、理解しました。
それでは、以下のような方法ではいかがでしょうか。
% 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);
更多回答(0 个)
另请参阅
产品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!