行列の各要素に対してすべての組み合わせで引き算を行うやり方を知りたい
조회 수: 18 (최근 30일)
이전 댓글 표시
以下の行列において,
A=[1 1 2 2 3 3 4 4 5 5 6 6
3 2 3 4 5 6 7 8 9 9 9 9
4 9 8 7 6 5 4 3 2 1 0 1
2 3 4 5 6 8 7 8 6 5 5 4];
操作* : 一列目, 二列目に関してして, 各々の要素の全ての組み合わせにおいて引き算の絶対値を求める
一列目: abs(1-3), abs(1-4), abs(1-2), abs(3-4), abs(3-2), abs(4-2)
二列目: abs(1-2), abs(1-9), abs(1-3), abs(2-9), abs(2-3), abs(9-3)
二列ごとに操作*を行いたいときはどうしたら良いのでしょうか?
具体的には,
A12=[1 1
3 2
4 9
2 3];
A34=[2 2
3 4
8 7
4 5];
%~A1112まで
A12, A34, A45...A1112について操作*を行いたいです.
댓글 수: 0
답변 (1개)
Atsushi Ueno
2024년 8월 28일
편집: Atsushi Ueno
2024년 8월 28일
下記サンプルでは、引き算の絶対値を”D”で始まる各変数に格納しました。
入力”A”の列数が奇数の場合、最後の列は無視されます。
A = [1 1 2 2 3 3 4 4 5 5 6 6
3 2 3 4 5 6 7 8 9 9 9 9
4 9 8 7 6 5 4 3 2 1 0 1
2 3 4 5 6 8 7 8 6 5 5 4];
% Aの全列について操作*を行う
for k = 1:width(A)
% 操作:k列目の各要素の組み合わせにおいて引き算の絶対値を求める
D(:,k) = abs(diff(nchoosek(A(:,k),2),1,2));
% kが偶数の時(2列毎)、AとDを個別変数に格納する
if(~mod(k,2))
eval("A"+(k-1)+(k)+"=[A(:,k-1) A(:,k)];");
eval("D"+(k-1)+(k)+"=[D(:,k-1) D(:,k)];");
end
end
D
A12
A34
D12
D34
whos
댓글 수: 6
Atsushi Ueno
2024년 8월 29일
あらま。隣同士の二乗和(の平方根)ではなく、2列ずつ組にして二乗和を求めるのですね。
>この二行を一行で表す方法などありますでしょうか?
⇛こうなります。なお列数が奇数の場合エラーになるので予め制限する必要があります。
D = D(:,1:floor(width(D)/2)*2) % 列数を偶数に制限する
%SQ = hypot(D(:,1:end-1),D(:,2:end)); % 隣列との二乗和の平方根を求める
SQ_even = hypot(D(:,1:2:end),D(:,2:2:end)) % 2列ずつ二乗和の平方根を求める
%SQ_even=SQ(:,1:2:end);
A = [1 1 2 2 3 3 4 4 5 5 6 6; 3 2 3 4 5 6 7 8 9 9 9 9; 4 9 8 7 6 5 4 3 2 1 0 1; 2 3 4 5 6 8 7 8 6 5 5 4];
A = A(:,1:floor(width(A)/2)*2); % 列数を偶数に制限する
index = nchoosek(1:height(A), 2); % 1列の全二項組み合わせ(行index)
D = A(index(:,2),:) - A(index(:,1),:); % の差分(abs()は外した)
SQ_even = hypot(D(:,1:2:end),D(:,2:2:end)); % 2列ずつ二乗和の平方根を求める
p = plot(SQ_even'); % プロット
set(p,{'Marker'},{'o';'^';'s';'d';'p';'h'});
참고 항목
카테고리
Help Center 및 File Exchange에서 ビッグ データの処理에 대해 자세히 알아보기
제품
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!