为什么列向量在用于索引矩阵时会返回行向量?

时间:2014-07-31 14:32:59

标签: matlab matrix vector

想象一下,在MATLAB中定义了以下矩阵:

>> matrix=10:18

matrix =

     10    11    12    13    14    15    16    17    18

现在我想使用另一个矩阵来索引第一个

>> index=[1,2;3,4]

index =

     1     2
     3     4

>> matrix(index)

ans =

     10     11
     12     13

到目前为止,答案的大小与矩阵'index'的大小相匹配。如果我使用行向量作为索引矩阵,则输出也是行向量。但是当我使用列向量作为索引矩阵时会出现问题:

>> index=(1:3)'

index =

     1
     2
     3

>> matrix(index)

ans =

    10    11    12

正如您所看到的,答案的大小与矩阵“索引”的大小不一致。索引矩阵和ans矩阵的大小的这种不一致性使我无法编写接受任意大小的索引矩阵的代码。

我想知道其他人是否曾经遇到过这个问题并且已经找到了某种解决方案;换句话说,我如何强迫MATLAB给出一个与任意大小的索引矩阵大小相同的ans矩阵?

干杯


解决方案

@ Dev-iL很好地解释了here为什么这是Matlab的行为方式,而@Dan提出了一个通用的解决方案here。但是,我的代码有一个更简单的临时解决方法,我已经解释过here

3 个答案:

答案 0 :(得分:4)

原因来自函数subsref.m,在使用括号时调用:

%SUBSREF Subscripted reference.
%   A(I) is an array formed from the elements of A specified by the
%   subscript vector I.  The resulting array is the same size as I except
%   for the special case where A and I are both vectors.  In this case,
%   A(I) has the same number of elements as I but has the orientation of A.

如您所见,在向量的特殊情况下,结果的形状将与示例中matrix的形状相同。

至于解决方法,恕我直言Dan has the cleanest solution

答案 1 :(得分:3)

Dev-iL has explained为什么会这样。这是一个潜在的解决方法:

reshape(matrix(index),size(index))

答案 2 :(得分:3)

预先输出大小为index矩阵的输出矩阵。 然后为相应的索引分配相应的值

out = zeros(size(index));
out(index) = matrix(index);

示例

index  = (1:3)'

 index =

      1
      2
      3

 >> out = zeros(size(index))

 out =

      0
      0
      0

 >> in = magic(3)

 in =

      8     1     6
      3     5     7
      4     9     2

 >> out(index) = in(index)

 out =

      8
      3
      4

 >>