2015-12-26 66 views
-3

我想将矩阵/矢量中的某些值替换为-1,但似乎无法做到。Matlab无法设置为负值,-1

x = [1 5 6; 2 4 3; 3 4 2; 4 2 1]; 
z = x(:,1) == 4 % get result I want 
z = 

0 
0 
0 
1 

changem(z,-1,0) % changem doesn't work 

ans = 

1 
1 
1 
1 

相同的,如果我做数组中changem

changem(z,[-1 1],[0 1]) 
ans = 

1 
1 
1 
1 

这也不起作用

z(1) = -1 
z = 

    1 
    0 
    0 
    1 

为什么我不能操纵向量得到以下值

ans = 

-1 
-1 
-1 
1 

该方法w orks,但是对上一个问题的回答很好,谢谢。

z = x(:,1) ~= 4; 
z = z * -1; 
z = changem(z,1,0) 
ans = 

-1 
-1 
-1 
1 
+0

什么是变化?一个函数?它有什么作用? –

回答

1

逻辑运算返回来自二进制集{0,1}的值。如果你想把这些作为{-1,+1},一个简单的变换就是乘以2,然后减去1。

z = (x(1, :) == 4)*2 - 1 
+0

@crowdedComputeer所以对z的赋值是一个二进制集合,只有乘法操作才会改变类型,这就是为什么changem或赋值给索引不起作用的原因。迷人。 – h1vpdata

+0

是的。 “==”操作返回逻辑类型,其行为与数字类型不同。我提出的转换利用了Matlab动态输入的事实,并且在应用乘法时自动提升逻辑倍数。 – crowdedComputeeer

+0

@crowdedComputeeer你混淆了动态类型和弱类型。 MATLAB允许你在逻辑上应用'+'并执行隐式转换的事实表明输入很弱,但与动态输入无关。例如,C是静态类型的,但执行类似的隐式类型转换。 – Jubobs

0

我不知道changeme是什么,因此不能评论该功能的结果。在Matlab和各种环境(例如C,C++)中,零值计算为逻辑错误,除零之外的任何值都计算为逻辑真值。例如在Matlab中,logical(x)将把双数组x转换成二进制/逻辑数组。 logical(-1)评估为1(即真)。如果z是逻辑阵列和你进行分配:

z(1) = -1; 

会发生什么是双-1被转换为二进制值,这是true(即1),因为除了0一切都被转换为true 1。然后1分配给z的第一个索引。所有工作都应该如此。