我有3个相同大小的矢量,如:
x = [1 2 3 3 4 5 5 5]
,
A = [30 40 50 52 60 70 73 71]
,
B = [10 20 40 50 40 30 20 40]
。
现在我想在x中看到并找到x中相同值(3,3)(5,5,5)的索引
然后在B(40,50)(30 20 40)中查看相同指数的值,然后将此值改为仅有最大值,另一个为0.这意味着我的resualt为
Bx=[10 20 0 50 40 0 0 40]
然后使用这个非零值Bx的索引将A的值作为
Abx=[30 40 0 52 0 0 71]
。
任何人都可以帮助我吗?
答案 0 :(得分:3)
使用accumarray
:
Bx = accumarray(x(:), B(:), [], @(x) {(x==max(x)).'*max(x)});
Bx = horzcat(Bx{:});
Abx = A.*(Bx~=0);
使用bsxfun
:
e = double(bsxfun(@eq, x(:), x(:).'));
e(e==0) = NaN;
ind = max(bsxfun(@times, e, B(:)))==B;
Bx = B.*ind;
Abx = A.*ind;
要一次为多行执行此操作(x
,A
和B
现在是矩阵):将第一个维度发送到第三个维度(使用permute
)和按上述方式工作:
e = double(bsxfun(@eq, permute(x, [2 3 1]), permute(x, [3 2 1])));
e(e==0) = NaN;
ind = squeeze(max(bsxfun(@times, e, permute(B, [2 3 1])))).'==B;
Bx = B.*ind;
Abx = A.*ind;
示例:
x = [1 2 3 3 4 5 5 5
3 2 4 4 4 5 5 5]
A = [30 40 50 52 60 70 73 71
71 73 70 60 52 50 40 30]
B = [10 20 40 50 40 30 20 40
40 20 30 40 50 40 20 10]
结果
Bx =
10 20 0 50 40 0 0 40
40 20 0 0 50 40 0 0
Abx =
30 40 0 52 60 0 0 71
71 73 0 0 52 50 0 0