行列の各要素に対して​すべての組み合わせで​引き算を行うやり方を​知りたい

53 次查看(过去 30 天)
takumi
takumi 2024-8-28,10:26
评论: takumi about 9 hours 前
以下の行列において,
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について操作*を行いたいです.

回答(1 个)

Atsushi Ueno
Atsushi Ueno 2024-8-28,11:21
编辑:Atsushi Ueno 2024-8-28,11:32
組み合わせは nchoosek 関数、差分は diff 関数、絶対値は abs 関数が利用可能です。
下記サンプルでは、引き算の絶対値を”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
D = 6x12
2 1 1 2 2 3 3 4 4 4 3 3 3 8 6 5 3 2 0 1 3 4 6 5 1 2 2 3 3 5 3 4 1 0 1 2 1 7 5 3 1 1 3 5 7 8 9 8 1 1 1 1 1 2 0 0 3 4 4 5 2 6 4 2 0 3 3 5 4 4 5 3
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
A12
A12 = 4x2
1 1 3 2 4 9 2 3
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
A34
A34 = 4x2
2 2 3 4 8 7 4 5
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
D12
D12 = 6x2
2 1 3 8 1 2 1 7 1 1 2 6
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
D34
D34 = 6x2
1 2 6 5 2 3 5 3 1 1 4 2
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
whos
Name Size Bytes Class Attributes A 4x12 384 double A1112 4x2 64 double A12 4x2 64 double A34 4x2 64 double A56 4x2 64 double A78 4x2 64 double A910 4x2 64 double D 6x12 576 double D1112 6x2 96 double D12 6x2 96 double D34 6x2 96 double D56 6x2 96 double D78 6x2 96 double D910 6x2 96 double ans 1x1 8 double cmd 1x1 294 string cmdout 1x33 66 char gdsCacheDir 1x14 28 char gdsCacheFlag 1x1 8 double i 0x0 0 double k 1x1 8 double managers 1x0 0 cell managersMap 0x1 8 containers.Map mshDir 1x18 36 char prefDir 1x1 170 string status 1x1 8 double
  6 个评论
Atsushi Ueno
Atsushi Ueno 2024-8-29,13:09
あらま。隣同士の二乗和(の平方根)ではなく、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'});
takumi
takumi about 9 hours 前
大変たすかりました.
丁寧なご回答ありがとうございました.

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 ループと条件付きステートメント 的更多信息

标签

产品

Community Treasure Hunt

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

Start Hunting!