Матричное преобразование в MATLAB - PullRequest
0 голосов
/ 24 ноября 2018

Например, у меня есть матрица A (рисунок 1).Когда переменная n = 2, я хочу, чтобы она была преобразована в матрицу B. Красный прямоугольник показывает правило преобразования каждого столбца.Согласно этому правилу, когда n = 3, он может стать матрицей C.

Я написал скрипт, используя метод цикла for, но это пустая трата времени, когда матрица A очень большая (например, 11688 * 140000).Есть ли эффективный способ решения этой проблемы?

Рисунок 1:

Figure 1

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Если у вас есть набор инструментов для обработки изображений, вы можете использовать im2col следующим образом:

result = im2col(A, [n 1], 'sliding');
0 голосов
/ 24 ноября 2018

Вот способ использования reshape и implicit expansion:

result = reshape(A((1:size(A,1)-n+1) + (0:n-1).', :), n, []);

Например, предположим, что n = 3.Неявное расширение используется для извлечения индексов строк:

row_ind = (1:size(A,1)-n+1) + (0:n-1).';

Создается следующая матрица:

1   2
2   3
3   4

Извлечение нужных строк из A:

A_expanded = A(row_ind, :)

Когда матрица row_ind используется в качестве индекса, она ведет себя как вектор:

                1
                2
1   2           3
2   3     ->    2
3   4           3  
                4


A_expanded =

   3   5   7
   6   8   9
   2   6   3
   6   8   9
   2   6   3
   1   2   1

Теперь A_expanded можно изменить до нужного размера:

result = reshape(A_expanded, n, []);

>>result =

   3   6   5   8   7   9
   6   2   8   6   9   3
   2   1   6   2   3   1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...