Взять разницу между матрицами разных размеров в 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 являются следующие:

  1. Он состоит из t подматрицы. В примере t=5,

  2. Каждая подматрица t имеет размерность b x 3 с b<=m а также b может принимать любое значение в {3,4,5,...,m} (ясно, таким образом, что сумма всех строк m). В примере первая и вторая подматрицы имеют размерность 3 x 3последние три подматрицы имеют размерность 4 x 3,

  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];

наслаждаться

Другие вопросы по тегам