У меня есть вектор 2x1
в Matlab, который называется x
.
clear
rng default
x=[5;6]; %[x1;x2]
Я применяю два линейных преобразования к x
и получаю 6x1
векторы A1
и A2
.
Линейное преобразование 1
B1=10^6* [1 1;
0 0;
0 0;
0 0;
0 0;
0 0] - 10^6 * [0 0;
1 1;
0 0;
0 0;
0 0;
0 0] + [0 0;
0 0;
-1 0;
0 -1;
-1 1;
0 0];
A1=B1*x;
%A1=[10^6*(x1+x2); -10^6(x1+x2); -x1; -x2; x2-x1; 0]
Линейное преобразование 2
B2=10^6* [1 1;
0 0;
0 0;
0 0;
0 0;
0 0] - 10^6 * [0 0;
1 1;
0 0;
0 0;
0 0;
0 0] + [0 0;
0 0;
-1 1;
0 -1;
-1 0;
0 0];
A2=B2*x;
%A2=[10^6*(x1+x2); -10^6(x1+x2); x2-x1; -x1; -x2; 0]
Пусть y
будет вектором 1x2
с первым элементом y1
, выбранным из A1
, и вторым элементом y2
, выбранным из A2
. Поскольку A1
и A2
имеют элементы 6
, y
может принимать значения 36
. Пусть Y
будет матричным списком 36x2
в каждой строке возможного значения y
.
Следовательно,
%Y=[10^6*(x1+x2) 10^6*(x1+x2);
% 10^6*(x1+x2) -10^6*(x1+x2);
% 10^6*(x1+x2) x2-x1;
% 10^6*(x1+x2) -x2;
% 10^6*(x1+x2) -x1;
% 10^6*(x1+x2) -0;
% -10^6*(x1+x2) 10^6*(x1+x2);
% ...]
Я бы хотел, чтобы вы помогли записать код, строящий матрицу C
размера (2K)x2
, такую, что
K=nchoosek(36,2)
, т.е. K=36!/(2*34!)=630
C*x=D
, где D
размера 2Kx1
сообщает, для каждой возможной пары (i,j)
строк из Y
,
[-Y(i,1)+Y(j,1);
-Y(i,2)+Y(j,2)]
Следовательно,
%D=[-10^6*(x1+x2)+10^6*(x1+x2); %rows 1,2 (first coordinate)
% -10^6*(x1+x2)-10^6*(x1+x2); %rows 1,2 (second coordinate)
% -10^6*(x1+x2)+10^6*(x1+x2); %rows 1,3 (first coordinate)
% -10^6*(x1+x2)+x2-x1; %rows 1,3 (second coordinate)
% ...]
Комментарии: позвольте мне уточнить, что я знаю, какие элементы должны быть внутри C
, чтобы получить желаемый D
, но я бы хотел не вставлять их "вручную". Должен быть какой-то «шаблон», позволяющий быстро собрать C
.
Также, в идеале, я бы хотел, чтобы код не полагался на конкретное содержимое B1
и B2
, то есть: предположим, что я заменяю B1
и B2
на другие матрицы, производящие различные линейные преобразования x
; Я хотел бы, чтобы код для получения C
оставался действительным.