形状変換

6 views (last 30 days)
sz
sz on 8 Nov 2021
Answered: Shunichi Kusano on 8 Nov 2021
現在19×19の行列が231250個あります。
この中身は全て1と0の数字しかなく対角部分は数字が同じで対角線上は必ず1が入るようにしています。
そして対角になる部分だけを取り出して行列の形状変換をお願いしたいです。
行列が多いので3×3で下記で説明するので、それを19×19を231250個でどのように書けばよいかスクリプトを教えていただきたいです。
3×3行列が3個ある場合で説明
1 1 0     1 0 1    1 1 0
1 1 0     0 1 1    1 1 1
0 0 1     1 1 1    0 1 1
この1行2列目と1行3列目と2行3列目の数字だけ取り出して1行にまとめる
(1,0,0)
(0,1,1)
(1,0,1)
このように三次元のものを2次元に変更したいです
19×19の231250個分の場合171×231250行列になるはずです。
よろしくお願いいたします
rng(1,'philox')
X = randi([0 1], 19, 19, 231250);
乱数使用で1と0の行列は作りました。

Accepted Answer

Shunichi Kusano
Shunichi Kusano on 8 Nov 2021
reshapeによる配列変形で楽に処理可能です。
clear
wh = 19;
num = 10000;
X = randi([0 1], wh, wh, num); % ダミーデータ(どうせ使わないので対角性は考慮していない)
% 下対角成分だけを抽出するためのマスク
mask = double(~triu(ones(wh)));
mask(mask==0) = nan;
% マスキング
X_ = X .* mask;
% 変形
X_ = reshape(X_,wh^2,num);
X_(isnan(X_(:,1)),:) = []; % マスクした要素を行ごと消去
X_ = X_'; % 必要に応じて

More Answers (0)

Community Treasure Hunt

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

Start Hunting!