有人可以解释为什么在例子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
答案 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==0
为true
。