【问题标题】:forcing limits on a vector in matlab在matlab中强制限制向量
【发布时间】:2013-08-18 06:48:55
【问题描述】:

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

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

我做错了什么?请帮忙。

【问题讨论】:

  • 请查看此链接:stackoverflow.com/questions/18201729/…。这是这个问题的延续。
  • 您确定您的实际 B 输出是否正确?符合你提到的条件
  • 对不起,我更正了我期望的答案。请检查我编辑的问题。
  • 您的预期结果与问题描述完全不符。比如10不在-0:0的范围内
  • 我犯了一个错误。不应该将其称为范围。请重新检查我的代码!如果特定的 no 大于 no range1 或小于 range1,那么我将其强制为 10(特定值)。

标签: matlab matrix


【解决方案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) &gt; range2 ) 现在如何索引aRange(有3 个元素)而不是直接索引B(有9 个元素)。

【讨论】:

  • 感谢您的回答。我也明白这一点,但你能告诉我如何修改我的代码,以便访问矩阵的正确元素。我的意思是我应该将零或其他东西填充到另一个矩阵然后应用这个索引操作吗?
  • 是的,我现在确实看到了您的编辑。感谢你的回答。效果很好。
  • 你好。这可以使用 bsxfun 函数执行吗?问题继续来自:stackoverflow.com/questions/18201729/…
  • 既然你已经将B“扁平化”成一个矢量,我不这么认为。
【解决方案2】:

你可以这样做:

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(:);

【讨论】:

  • 感谢这也有效。但正如我之前所说,我希望对矩阵 B 进行操作,而不是对矩阵 A 进行操作。列矩阵已经形成。
  • 好吧,如果你想使用 mxn 矩阵,你可以忽略最后一行。而且,该操作仅在矩阵 B 上完成;)
  • 你好。这可以使用 bsxfun 函数执行吗?问题继续来自:stackoverflow.com/questions/18201729/…
猜你喜欢
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
  • 2014-04-13
  • 1970-01-01
  • 2016-02-12
相关资源
最近更新 更多