3

次の操作を実行するための Matlab 効率的な方法 (ループなし) は何ですか: 入力ベクトル入力を出力ベクトル出力に変換します。出力(i) は、入力(i)以下の入力内の整数の数です.

例えば:

input = [5 3 3 2 4 4 4]

与えるでしょう:

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

2 に答える 2

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 に答える
1

私は可能な答えを見つけました:

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

ただし、ベクトル化を利用していません。

于 2012-12-07T23:38:58.613 に答える