【问题标题】:Indexing vectors with multidimensional arrays用多维数组索引向量
【发布时间】:2013-09-21 06:56:12
【问题描述】:

有人可以帮帮我吗?

我有一个 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
 ...

结果不保留原始矩阵的结构。我希望结果与上一个示例中的结果相同,但我想使用第二列进行替换。最好的方法是什么?

【问题讨论】:

  • 您可以使用reshape 使结果恢复原状。
  • @s.bandara,谢谢!什么方案更有效率:1)使用reshape 2)复制第二列column_2 = column(:,2); column_2(matrix)
  • 我不知道。如果它对你真的很重要,你应该尝试分析它。 MATLAB 在这些方面可能令人惊讶。
  • @s.bandara,好的,我去看看。

标签: matlab indexing


【解决方案1】:

您可以通过预分配输出数组来强制维度:

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.

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    • 2018-01-22
    • 2015-11-04
    • 1970-01-01
    相关资源
    最近更新 更多