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