0

配列の最後の値を取得し、その配列で見つかった次に低い値で次の配列を開始する出力を生成しようとしています。次に低い値がない場合は、ループを終了させたいと思います。以下に取得しようとしている回答の例を参照してください。

9.0000   11.0000    5.0000    7.0000    3.0000    7.0100
7.0000    3.0000    7.0100    9.0000   11.0000    5.0000
3.0000    7.0100    9.0000   11.0000    5.0000    7.0000

以下で使用しているコードは、最初の 2 行のみを正しく取得し、最後に奇妙なことを行い、これを修正する方法を考えています。

コード:

clc
a=[9,11,5,7,3,7.01];
[a_sorted, a_idx] = sort(a, 2); %sorts array along with getting index values of numbers
a_sorted=a_sorted'; % sort into col
a_idx=a_idx'; % sort into col
a_val_idx=[a_sorted a_idx]; % combine array

loop_amount=length(find(a<a(end))) %how many values are less than the last value, loop this many times

for yy=1:loop_amount

    a_val=find(a_val_idx(:,1)<a(end)); %find idx of next lowest value from end 
    nxt_low_idx_val=a_val_idx(a_val(end),2) %get idx of the next lowest value from end

    b=circshift(a,[0 (length(a)-nxt_low_idx_val+1)])

    a=b;

end

私が得る結果は

loop_amount =  3
a =
    9.0000   11.0000    5.0000    7.0000    3.0000    7.0100

nxt_low_idx_val =  4
a =
    7.0000    3.0000    7.0100    9.0000   11.0000    5.0000

nxt_low_idx_val =  5
a =
   11.0000    5.0000    7.0000    3.0000    7.0100    9.0000

nxt_low_idx_val =  6

ご覧のとおり、最後の行は次のようになります

nxt_low_idx_val =  2

3.0000    7.0100    9.0000   11.0000    5.0000    7.0000

これを修正する方法はありますか?

ありがとう

4

2 に答える 2

1

あなたのコードを見るのが面倒です。これはどう?

a = [9,11,5,7,3,7.01];
disp(' ')
disp(a) % display original value
len = length(a);

loop_count = sum(a<a(end)); % as per your code
for count = 1:loop_count
  b = a(1:end-1); % copy of a, will be overwritten
  b(b>a(end)) = NaN; % these values do not count
  if(all(isnan(b)))
    break % exit if there are no lower values
  end
  [aux ind] = max(b); % max of the remaing values
  perm = mod(ind+(0:len-1),len); % cyclic shift
  perm(perm==0) = len; % correct zero to len
  a = a(perm); % do the shift
  disp(a) % display new value
end
于 2013-08-04T17:12:14.233 に答える