質問: 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 b= 8 15 1 17 24 14 16 7 23 5 20 22 13 4 6 21 3 19 10 12 2 9 25 11 18
回答: マニュアルを見ると circshift の2つ目の引数は整数と書いてあります。エラーメッセージに書いてあるとおりです。ceilとかfloorで整数にしたところで希望する結果は得られません。 関数1個で解決するに越したことはないのですが、最適なものを見つけられなかったり、存在しなくて簡単には解決しないこともよくあります。そういうときは泥臭い方法で解決するのも一つの手段です。 まず2回にシフトしてみました。 a = magic(5) hw = ceil(size(a,2)/2); b = circshift(a, [0 hw]); b(:,[1:hw]) = circshift(b(:,[1:hw]), [0 -1]); b これだと偶数配列の場合はだめですね。 配列のインデックスを使って入れ替え。 a = magic(5) % 最終的にこのようにしたい % b = a; % b(:,[4 5 1 2]) = a(:,[1 2 4 5]); w = size(a,2); hw = floor(w/2); i = circshift( 1:w, hw ); ib = i(1:hw*2) ia = circshift( ib, hw ); b = a; b(:,ib) = a(:,ia); b 良さそうだけど、長しい、何をやっているのかがわかりにくい。 あわせ技を思いつきました。 a = magic(5) b = a; i = [1 2 4 5]; b(:,i) = circshift(a(:,i), [0 2]); b これならスッキリしてて動作も理解しやすそうです。iさえ作れれば。 w = size(a,2); i = 1:w; if mod(w,2) i(ceil(w/2)) = []; end こうなるのか。結局あまりきれいには書けませんでしたが、これでご希望の変換ができると思います。