Вот метод, основанный на простой индексации, который работает для произвольной матрицы. Мы хотим, чтобы каждый элемент будет расширен до подматрицы 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
Наконец, при индексировании массива, «конец» ключевое слово имеет значение размера массива в C или соответствующей размерности. В результате в этом примере следующие эквиваленты:
>> 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])
Ницца! Я думал, что должен быть какой-то способ сделать это с repmat и перестановкой столбцов и строк, но мой мозг все еще находится в полусмерти. – las3rjock
Решение gnovice с использованием функции Kroneker KRON лучше - это более прямолинейно и понятно - «преднамеренное программирование» – Mikhail
Мне нравится ответ Мартинна лучше, но это только я. –