Мне нужна помощь в преобразовании матрицы 2X2 в матрицу 4X4 следующим образом:
A = [2 6;
8 4]
должно стать:
B = [2 2 6 6;
2 2 6 6;
8 8 4 4;
8 8 4 4]
Как бы я это сделал?
Мне нужна помощь в преобразовании матрицы 2X2 в матрицу 4X4 следующим образом:
A = [2 6;
8 4]
должно стать:
B = [2 2 6 6;
2 2 6 6;
8 8 4 4;
8 8 4 4]
Как бы я это сделал?
В более новых версиях MATLAB (R2015a и более поздние) самый простой способ сделать это — использовать repelem
функция:
B = repelem(A, 2, 2);
Для более старых версий короткой альтернативой другим (в основном) решениям на основе индексирования является использование функций kron
и ones
:
>> A = [2 6; 8 4];
>> B = kron(A, ones(2))
B =
2 2 6 6
2 2 6 6
8 8 4 4
8 8 4 4
Можно сделать даже проще, чем решение Джейсона:
B = A([1 1 2 2], :); % replicate the rows
B = B(:, [1 1 2 2]); % replicate the columns
Вот еще одно решение:
A = [2 6; 8 4];
B = A( ceil( 0.5:0.5:end ), ceil( 0.5:0.5:end ) );
который использует индексирование для всего и не полагается на размер или форму A.
Это работает:
A = [2 6; 8 4];
[X,Y] = meshgrid(1:2);
[XI,YI] = meshgrid(0.5:0.5:2);
B = interp2(X,Y,A,XI,YI,'nearest');
Это просто двумерная интерполяция ближайшего соседа A(x,y) от x,y ∈ {1,2} до x,y ∈ {0,5, 1, 1,5, 2}.
Редактировать: трамплин из решений Джейсона С. и Мартейна, я думаю, что это, вероятно, самое короткое и ясное решение:
A = [2 6; 8 4];
B = A([1 1 2 2], [1 1 2 2]);
Вот метод, основанный на простом индексировании, который работает для произвольной матрицы. Мы хотим, чтобы каждый элемент был расширен до подматрицы MxN:
A(repmat(1:end,[M 1]),repmat(1:end,[N 1]))
Пример:
>> A=reshape(1:6,[2,3])
A =
1 3 5
2 4 6
>> A(repmat(1:end,[3 1]),repmat(1:end,[4 1]))
ans =
1 1 1 1 3 3 3 3 5 5 5 5
1 1 1 1 3 3 3 3 5 5 5 5
1 1 1 1 3 3 3 3 5 5 5 5
2 2 2 2 4 4 4 4 6 6 6 6
2 2 2 2 4 4 4 4 6 6 6 6
2 2 2 2 4 4 4 4 6 6 6 6
Чтобы увидеть, как работает этот метод, давайте подробнее рассмотрим индексацию. Начнем с простого вектора-строки последовательных чисел.
>> m=3; 1:m
ans =
1 2 3
Затем мы расширяем его до матрицы, повторяя его M раз в первом измерении.
>> M=4; I=repmat(1:m,[M 1])
I =
1 2 3
1 2 3
1 2 3
1 2 3
Если мы используем матрицу для индексации массива, то элементы матрицы используются последовательно в стандартном порядке Matlab:
>> I(:)
ans =
1
1
1
1
2
2
2
2
3
3
3
3
Наконец, при индексировании массива ключевое слово end оценивается как размер массива в соответствующем измерении. В результате в примере следующее эквивалентно:
>> A(repmat(1:end,[3 1]),repmat(1:end,[4 1]))
>> A(repmat(1:2,[3 1]),repmat(1:3,[4 1]))
>> A(repmat([1 2],[3 1]),repmat([1 2 3],[4 1]))
>> A([1 2;1 2;1 2],[1 2 3;1 2 3;1 2 3;1 2 3])
>> A([1 1 1 2 2 2],[1 1 1 1 2 2 2 2 3 3 3 3])
Существует функция Reshape(), которая позволяет вам сделать это...
Например:
reshape(array, [64, 16])
И вы можете найти отличный видеоурок здесь
Ваше здоровье