如何在Matlab中参考另一个向量来划分向量?

时间:2012-02-25 08:58:13

标签: matlab

我想知道我是否可以在Matlab中有效地完成以下操作。为问题编写一个简单的循环是非常简单的,但我试图找出是否有任何可以使用的专门函数(也许arrayfun / accumarray(?) - 我都很棒理解上的麻烦!)提前谢谢。

假设我有两个向量,如下所示(在Matlab中):

A = [15 4 9 6 7 5 11 3 14]; 
B = [2 7 13]; 

我想做以下事情:

  1. 排序B,如果尚未排序。
  2. 对于B中的每个连续窗口(即[2,7][7,13]),找到位于窗口内的A中的相应元素。
  3. 在此“分区”A中,A中位于B的第n个窗口中的元素减1 n次。
  4. 示例:在上述情况下,B的第一个窗口是[2,7]。位于此窗口内的A中的元素为[5,4,3,6]。当它们位于B的第一个窗口内时,我需要从每个元素中减少1次。此操作后,新的A将如下所示: A = [15 3 9 5 7 4 11 2 14];

    这个问题可以简化为Matlab中的一些函数调用,还是应该通过朴素的循环业务呢?谢谢!

1 个答案:

答案 0 :(得分:2)

使用histc函数确定值是什么bin(你称之为“窗口”),可以很容易地做到这一点。

A = [15 4 9 6 7 5 11 3 14];
B = [2 7 13];
B = sort(B); 
[~, bin] = histc(A, B);
A = A - bin;

修改 我注意到我的解决方案与您的解决方案不同,但我怀疑您的计算错误。您是否必须从第二个bin中的值中减去2或者是否按原样保留它们?如果您只想更改第一个bin中的值,则最后一行应为A(bin==1) = A(bin==1) - 1

A = [15 4 9 6 7 5 11 3 14]; % initial value of A
A = [15 3 9 5 7 4 11 2 14]; % your reference result
A = [15 3 7 5 5 4  9 2 14]; % my result (as above)
A = [15 3 9 5 7 4 11 2 14]; % my result with A(bin==1) = A(bin==1) - 1

要更改bin边缘的值应该在哪个bin中更改,您可以尝试从eps添加/减去B