什么是执行以下操作的 Matlab 高效方式(无循环):将输入向量输入转换为输出向量输出,例如输出(i) 是输入中小于或等于输入(i)的整数个数.
例如:
input = [5 3 3 2 4 4 4]
会给:
output = [7 3 3 1 6 6 6]
我找到了一个可能的答案:
output = arrayfun(@(x) sum(x>=input),input)
但它没有利用矢量化。
首先,不要input
用于变量名,它是一个保留关键字。我将X
在这里使用。
获得所需结果的另一种方法是:
[U, V] = meshgrid(1:numel(X), 1:numel(X));
Y = sum(X(U) >= X(V))
这是一个单行:
Y = sum(bsxfun(@ge, X, X'))
编辑:
如果X
有多行并且您想在每一行上应用此操作,这有点棘手。以下是您可以执行的操作:
[U, V] = meshgrid(1:numel(X), 1:size(X, 2));
V = V + size(X, 2) * idivide(U - 1, size(X, 2));
Xt = X';
Y = reshape(sum(Xt(U) >= Xt(V))', size(Xt))'
例子:
X =
5 3 3 2 4 4 4
3 9 7 7 1 2 2
Y =
7 3 3 1 6 6 6
4 7 6 6 1 3 3