执行以下操作的Matlab有效方式(无循环)是什么:将输入向量输入转换为输出向量输出,例如输出(i)是输入中小于或等于 input (i)的整数。
例如:
input = [5 3 3 2 4 4 4]
会给:
output = [7 3 3 1 6 6 6]
答案 0 :(得分:1)
我找到了一个可能的答案:
output = arrayfun(@(x) sum(x>=input),input)
但它没有利用矢量化。
答案 1 :(得分:1)
首先,不要将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