Взять разницу между матрицами разных размеров в Matlab
У меня есть матрица A
в Matlab измерения m x 3
например, m=18
A=[ 2| 1 1;
3| 1 2;
-8| 1 3;
-------
-5| 1 1;
2| 1 2;
6| 1 3;
-------
7| 2 1;
3| 2 2;
1| 2 3;
5| 2 4;
-------
3| 2 1;
-8| 2 2;
1| 2 3;
0| 2 4;
-------
1| 2 1;
2| 2 2;
7| 2 3;
9| 2 4]
Характеристики A
являются следующие:
Он состоит из
t
подматрицы. В примереt=5
,Каждая подматрица
t
имеет размерностьb x 3
сb<=m
а такжеb
может принимать любое значение в{3,4,5,...,m}
(ясно, таким образом, что сумма всех строкm
). В примере первая и вторая подматрицы имеют размерность3 x 3
последние три подматрицы имеют размерность4 x 3
,Все подматрицы одного и того же измерения накладываются друг на друга. В примере, во-первых, у нас есть подматрицы
3 x 3
а затем подматрицы4 x 3
,
Тогда у меня есть матрица B
измерения f x 3
где f=size(unique(A(:,2:end),'rows','stable'),1)
где последние два столбца воспроизводят элементы в unique(A(:,2:end),'rows','stable')
Например, в приведенном выше примере f=7
а также
B=[2| 1 1;
3| 1 2;
1| 1 3;
7| 2 1;
8| 2 2;
10| 2 3;
2| 2 4]
Я хочу построить (возможно без петель) матрицу C
измерения f x t
такой, что C(:,i)
вычисляется
1) взять i
-я подматрица A
и назовите это H
, Количество рядов H
является <f
, Количество столбцов H
является 3
, Например, если i=1
в примере
H=[2| 1 1;
3| 1 2;
-8| 1 3]
2) вычислить D=ismember(B(:,2:3),H(:,2:3),'rows')
измерения f x 1
, когда i=1
в примере D=[1 1 1 0 0 0 0]'
;
3) Генерировать E(f,1)=0
т.е. в примере E=[0 0 0 0 0 0 0]'
,
4) Заменить E(D)=H(:,i)
в примере с i=1
, E=[2 3 -8 0 0 0 0]
5) вычислить C(:,i)=E-B(:,1)
в примере с i=1
,
C(:,1)=[2-2;
3-3;
-8-1;
0-7;
0-8;
0-10;
0-2]
В приведенном выше примере суммирование для всех i
C=[ 2-2 | -5-2 | 0-2 | 0-2 | 0-2 ;
3-3 | 2-3 | 0-3 | 0-3 | 0-3 ;
-8-1 | 6-1 | 0-1 | 0-1 | 0-1 ;
0-7 | 0-7 | 7-7 | 3-7 | 1-7 ;
0-8 | 0-8 | 3-8 |-8-8 | 2-8 ;
0-10 | 0-10 |1-10 |1-10 | 7-10;
0-2 | 0-2 | 5-2 | 0-2 | 9-2;]
У меня есть приблизительное представление о том, как построить C
используя цикл; Я был бы признателен за любое предложение, которое не требует зацикливания и, возможно, быстро, учитывая, что реальные матрицы, с которыми я работаю, имеют огромные размеры. Одна идея (которую я не знаю, как реализовать) может быть: создание переменной ячейки измерения tx1
в которой в каждой ячейке я положил подматрицу A
затем примените шаги 2),3),4),5) к каждой ячейке и выполните повторную сборку.
1 ответ
Хорошо, я надеюсь, что получил то, что вы хотели, так как ваш пример и код не были легко следовать. Что касается циклов, вам нужен только один, и, поскольку один уровень цикла скомпилирован, это не должно быть проблемой.
Сначала ваши входные данные, я транспонировал только для удобства чтения и добавил индексный столбец, который соответствует вашим строкам.
A = [1 1 1 2 2 2 3 3 3 3 4 4 4 4 5 5 5 5
2 3 -8 -5 2 6 7 3 1 5 3 -8 1 0 1 2 7 9
1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2
1 2 3 1 2 3 1 2 3 4 1 2 3 4 1 2 3 4]';
B = [2 3 1 7 8 10 2
1 1 1 2 2 2 2
1 2 3 1 2 3 4]';
t = length(unique(A(:,1)));
C = zeros(f,t);
for ii=1:length(unique(A(:,1)))
C(ismember(B(:,2:3),A(A(:,1)==ii,3:4),'rows'),ii) = A(A(:,1)==ii,2);
C(:,ii) = C(:,ii)-B(:,1);
end
Выход будет то, что вы хотели
C = [0 -7 -2 -2 -2
0 -1 -3 -3 -3
-9 5 -1 -1 -1
-7 -7 0 -4 -6
-8 -8 -5 -16 -6
-10 -10 -9 -9 -3
-2 -2 3 -2 7];
наслаждаться