0

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

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

我做错了什么?请帮忙。

4

2 回答 2

1

怎么了:

仔细查看您的命令:

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

现在让我们一步一步来

您正在调节最后三个元素B( 7:9, 1 ),即-3, -6-9
因此你最终得到

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

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

一个可能的修复:

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

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

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

于 2013-08-18T07:03:29.610 回答
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 的维度与您的 A 相同。

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

B=B(:);
于 2013-08-18T07:16:21.303 回答