2015-12-07 4 views

ответ

6

Используйте repmat для копирования ваших данных, затем permute, чтобы установить его в правильном формате. Потребность в permute возникает из-за использования большого порядка столбца на repmat, требуя, чтобы вы сначала создали три правильных ломтика 10x10, затем переключите первый и третий размеры, используя permute.

A = [1/4 1/2 1/4].'; % your data 
B = repmat(A,1,10,10); % use repmat to create a 3x10x10 copy 
C=permute(B,[3 2 1]); % permute to the correct order 

ans(:,:,1) = 

    0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 
    0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 
    0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 
    0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 
    0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 
    0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 
    0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 
    0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 
    0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 
    0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 


ans(:,:,2) = 

    0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 
    0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 
    0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 
    0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 
    0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 
    0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 
    0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 
    0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 
    0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 
    0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 


ans(:,:,3) = 

    0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 
    0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 
    0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 
    0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 
    0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 
    0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 
    0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 
    0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 
    0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 
    0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 0.2500 
+3

Это может быть быстрее, чем первая 'перестановка' (или' reshape'), а затем 'repmat', потому что таким образом перестановка/переформатирование выполняется с меньшим количеством элементов:' A = [1/4 1/2 1/4 ] '. B = repmat (изменить (A, 1,1, []), 10,10); ' –

+0

Или' A = cat (3, 1/3, 1/2, 1/4); B = repmat (A, 10,10); 'для дальнейшего упрощения кода. – Daniel

5

Если вы не настаиваете на использовании repmat, то вы можете использовать ones и bsxfun:

N = 10; 
v = [1/4 1/2 1/4]; 
A = ones(N,N,3); 
A = bsxfun(@times,A,permute(v,[3 1 2])) 

Это создаст N x N x 3 массив, каждый элемент которого является 1. Затем мы умножаем каждую подматрицу (от 1 до 3 в последнем индексе) с соответствующим значением от v, это достигается с помощью bsxfun. Для этого мы должны ввести основные размеры синглтона в v (превращение его в [1 x 1 x 3]), вот для чего нужен звонок для permute.

Update: Как @Divakar отмечено в комментарии, вы можете опустить последний аспект, когда первый определяющий A:

N = 10; 
v = [1/4 1/2 1/4]; 
A = ones(N,N); %one less dimension 
A = bsxfun(@times,A,permute(v,[3 1 2])) 

Причина этого заключается в том, что в MATLAB, предполагается, что каждая переменная имеет бесконечное номер trailing Размеры одноэлементного (вот почему reshape(rand(2),[2 2 1 1 1]) возвращает массив [2 x 2] вместо [2 x 2 x 1 x 1 x 1] один: размеры задней синглтонности неявно присутствуют и поэтому опущены). В этом случае вы умножаете матрицу [N x N] с номером [1 x 1 x 3], но первая неявно интерпретируется как [N x N x 1]. bsxfun заботится обо всем остальном.

+1

Вы даже можете начать с 2D 'A', я думаю,' bsxfun' позаботится о последнем тусклом расширении. – Divakar

Смежные вопросы