2014-06-13 63 views
5

有人可以解释为什么在例子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

您的示例没有意义。请为您遇到的问题添加正确的代码。你添加的代码总是给出一个1x6的矢量 – ASantosRibeiro

+1

@ASantosRibeiro:如果你在每个例子之前发出'clear newvec',则不是这样:) –

+1

+1有趣的问题。答案让你知道发生了什么,但只是添加一些东西。如果在工作空间中没有矢量,并且通过分配类似'A(5)= 1'的方式创建它(以前不存在'A'​​),则matlab将创建一个足以放置'1在第五个元素中,用零填充其余元素。尝试一下。你也可以用这种方式扩展一个矩阵,例如'x = 1:5; x(10)= 1',试试&你应该看到它用零填充元素6-9。我想你可以用类似的方式来思考你的问题,你告诉matlab分配到位置1和4,所以它停在4 – Dan

回答

3

编辑: 感谢Dan用于指出该错误。

vec == 0产生逻辑矩阵。 现在如果newvec的大小未定义那么newvec(vec==0) =1将始终创建一个新的行向量 newvec。当您预定义的newvec的大小,然后newvec(v==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] ; 

大小,它只分配1到相应的指数,其vec==0true

+3

“将创建一个向量newvec,其大小等于逻辑矩阵中真(one)值的数量”not true,newvec将是逻辑矩阵中最后一个“真”值位置的大小,而不是“真实”值的数量。 – Dan

+2

*“......其大小将等于逻辑矩阵中的真(一个)值的数量,在这种情况下为4”*,现在不是这样吗?因为例A中'newvec'的大小是1×6,而原来的'vec'中只有3个'trues'。 'newvec'的大小取决于* last *'true'的位置,这很奇怪。 –

+0

@Nishant:我一直注意到你有时会在你的答案和评论中用你的MATLAB语法出错。建议您实际使用MATLAB,并在下次输入答案之前将输出回显到屏幕上。这样你就不会误导OP以及其他阅读你答案的人。 – rayryeng

4

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

它听起来有点premature optimization(根据RAM的使用情况)和/或MATLAB的内部在分配之前拨打find或类似的东西。但是真的有人猜测。

更常见的方式做你想做的,是这样的:

newvec = (vec == 0); 
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)改为