次の操作を実行するための Matlab 効率的な方法 (ループなし) は何ですか: 入力ベクトル入力を出力ベクトル出力に変換します。出力(i) は、入力(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)
ただし、ベクトル化を利用していません。