具有多维数组的索引向量

时间:2013-09-20 18:23:59

标签: matlab indexing

有人可以帮助我吗?

我有一个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 个答案:

答案 0 :(得分: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.

另外,关于术语的注释,矩阵被定义为仅具有两个维度。