2013-09-20 7 views
0

Может кто-нибудь мне помочь, пожалуйста?Индексирующие векторы с многомерными массивами

У меня есть матрица 4x5x3 и колонка 2x1.

matrix = ones(4,5,3); 
column = ones(2,1); 
matrix(1,1,1) = 2; 
column(2,1) = 34; 

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

column(matrix) 

ans(:,:,1) = 

34  1  1  1  1 
1  1  1  1  1 
1  1  1  1  1 
1  1  1  1  1 


ans(:,:,2) = 

1  1  1  1  1 
1  1  1  1  1 
1  1  1  1  1 
1  1  1  1  1 


ans(:,:,3) = 

1  1  1  1  1 
1  1  1  1  1 
1  1  1  1  1 
1  1  1  1  1 

В конце концов я иметь такую ​​же матрицу, но с замещенными значениями.

Однако, когда я делаю это так:

matrix = ones(4,5,3); 
column = ones(2,2); 
matrix(1,1,1) = 2; 
column(2,2) = 34; 
column(matrix, 2) 
ans = 

34 
1 
1 
1 
1 
1 
1 
1 
1 
1 
1 
1 
... 

Результат не сохраняет структуру исходной матрицы. Я хочу, чтобы результат был таким же, как и в предыдущем примере, но я хочу использовать второй столбец для замены. Каков наилучший способ сделать это?

+1

Вы можете использовать 'reshape', чтобы вернуть результат в форму. –

+0

@ s.bandara, спасибо! Какое решение более эффективно: 1) Используйте reshape 2) Скопируйте второй столбец 'column_2 = column (:, 2); column_2 (matrix) ' – warmspringwinds

+0

Я не знаю. Вы должны попытаться профилировать его, если это действительно важно для вас. MATLAB может быть удивительным в таких вещах. –

ответ

2

Вы можете заставить размеры, предварительное выделение выходного массива:

out = zeros(size(array)); 
out(:) = column(array, 2) 

Несколько тайминги (предполагая, что вы заранее знаете размер array):

sz  = [4,5,3]; 
array  = ones(sz); 
array(1) = 2; 
column = ones(2); 
column(4) = 34; 
N   = 1e6; 


% extract column 
tic 
for ii = 1:N 
    tmp = column(:,2); 
    out1 = tmp(array); 
end 
toc 

% Preallocate 
tic 
for ii = 1:N 
    out2 = zeros(sz); 
    out2(:) = column(array, 2); 
end 
toc 

% Reshape 
tic 
for ii = 1:N 
    out3 = reshape(column(array, 2),sz); 
end 
toc 

Результаты:

Extract column: 2.714575 seconds. 
Preallocate: 7.179845 seconds. 
Reshape:  6.455695 seconds. 

Кроме того, примечание о терминологии, матрица определяется только для двух измерений.

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