在matlab中强制限制向量

时间:2013-08-18 06:48:55

标签: matlab matrix

我有一个问题: 假设我有一个矩阵

A =

    -1     2    -3
    -4     5    -6
    -7     8    -9

我将其转换为列矩阵

B = A(:)

B =

    -1
    -4
    -7
     2
     5
     8
    -3
    -6
    -9  

假设我想强制第一列元素位于特定范围内(-range1:range1),第二列元素位于(-range2:range2)& (-range3:range3)中的第三列元素。我尝试通过实现此代码来实现这一点:

range1 = 0;
range2 = -5;
range3 = 0;

B(B(1:3,1)<range1)=10;
B(B(4:6,1)>range2)=0;
B(B(7:9,1)<range3)=20;

我得到的答案是:

B =

    20
    20
    20
     2
     5
     8
    -3
    -6
    -9

我得到的正确答案是:

B =

    10
    10
    10
     0
     0
     0
    20
    20
    20

我做错了什么?请帮忙。

2 个答案:

答案 0 :(得分:1)

出了什么问题:

仔细查看你的命令:

>> B( B(7:9, 1) < range3 ) = 20;

现在让我们一步一步来做吧

您要调整B( 7:9, 1 )-3, -6的最后三个要素-9。 因此你最终得到了

>> B(7:9, 1) < range3
ans = 
  true
  true 
  true

您有三个元素的逻辑索引。使用这些逻辑索引来访问具有 9 元素的B,可以访问九个中的前三个元素
因此,您的所有命令仅修改B的前三个元素,而不会影响B的其余部分。

可能的解决办法:

您可以主动定义您正在处理的范围,例如,第二列:

>> aRange = 4:6;
>> B( aRange( B(aRange, 1) > range2 ) ) = 0

直接查看三向量逻辑索引B(aRange, 1) > range2 )如何索引aRange(有3个元素)而不是B(有9个元素)。

答案 1 :(得分:1)

你可以这样做:

A=[-1,2,-3;-4,5,-6;-7,8,-9];
range1 = 0;range2 = -5;range3 = 0;
B=A;
B((B(:,1)<range1),1)=10;
B((B(:,2)>range2),2)=0;
B((B(:,3)<range3),3)=20;

输出B的维度为mxn维度。

如果你想将它作为列向量。

B=B(:);