3

什么是执行以下操作的 Matlab 高效方式(无循环):将输入向量输入转换为输出向量输出,例如输出(i) 是输入中小于或等于输入(i)的整数个数.

例如:

input = [5 3 3 2 4 4 4]

会给:

output = [7 3 3 1 6 6 6]
4

2 回答 2

1

我找到了一个可能的答案:

output = arrayfun(@(x) sum(x>=input),input)

但它没有利用矢量化。

于 2012-12-07T23:38:58.613 回答
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
于 2012-12-08T00:36:14.757 回答