索引到矢量

时间:2014-06-13 10:52:04

标签: matlab

有人可以解释为什么在例子A中结果是1x6向量(这是有意义的并且是我所期待的)而在例B中结果是1x4向量吗?

在示例B中,如果我将newvec的大小预定义为1x6向量,则结果是正确的1x6向量。只是不了解发生了什么。

示例A

vec = [0 2 3 0 5 0]     %1x6
newvec(vec == 0) = 1    %produces a 1 x 6 vector

示例B

vec = [0 2 3 0 5 3]     %1 x 6
newvec(vec == 0) = 1    %produces a 1 x 4 vector

3 个答案:

答案 0 :(得分:4)

为什么,我们永远不会知道。这是The MathWorks和恕我直言的设计选择,它确实违反了principle of least surprise

它有点premature optimization(就RAM使用而言)和/或MATLAB的内部在分配之前调用find或类似的东西。但这是任何人的猜测,真的。

更常见的做法是做到这一点:

newvec = (vec == 0);

答案 1 :(得分:4)

如果在调用第二行时不存在newvec,则MATLAB只会将其设置为保持您设置为1的索引所需的大小。

你实际做的是:

newvec([1 4 6]) = 1;

newvec([1 4]) = 1;

同样,如果vec实际上是2D / 3D等矩阵,newvec将显示为1 x N,其中N是最高索引数,而不是保留形状原始矩阵。

因此,在这些情况下,您需要:

1)首先将newvec预先分配为vec的大小。

2)改为newvec = (vec==0)

答案 2 :(得分:3)

修改 感谢Dan指出错误。

vec == 0生成逻辑矩阵。 现在,如果未定义newvec的大小,则newvec(vec==0) =1将始终创建新的行向量 newvec。

以下步骤将决定此newvec

的大小
temp1 = logical_matrix(:);
trailing_zeros = number of zeros after the occurrence of last `true` value in temp1
size(newvec) = [1, numel(logical_matrix) - trailing_zeros] ;

当您预定义newvec 的大小时,newvec(v==0) = 1无法更改newvec的大小,它只会将1分配给相应的索引其中vec==0true