我想知道我是否可以在Matlab中有效地完成以下操作。为问题编写一个简单的循环是非常简单的,但我试图找出是否有任何可以使用的专门函数(也许arrayfun
/ accumarray
(?) - 我都很棒理解上的麻烦!)提前谢谢。
假设我有两个向量,如下所示(在Matlab中):
A = [15 4 9 6 7 5 11 3 14];
B = [2 7 13];
我想做以下事情:
B
,如果尚未排序。 B
中的每个连续窗口(即[2,7]
,[7,13]
),找到位于窗口内的A中的相应元素。 A
中,A
中位于B
的第n个窗口中的元素减1 n次。示例:在上述情况下,B
的第一个窗口是[2,7]
。位于此窗口内的A中的元素为[5,4,3,6]
。当它们位于B
的第一个窗口内时,我需要从每个元素中减少1次。此操作后,新的A
将如下所示:
A = [15 3 9 5 7 4 11 2 14];
这个问题可以简化为Matlab中的一些函数调用,还是应该通过朴素的循环业务呢?谢谢!
答案 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
。