ベクトルvから複数の要素を抽出し,新しいベクトルuを生成する方法には,以下のようにインデックスを指定する方法があります.
idx = [3 10 15 28];
u = v(idx);
この方法を拡張し,以下のようにN次元配列Aのi次元目のインデックスを指定することで複数の配列を抽出し,新しい配列Bを得ようと考えています.
idx = [3 10 15 28];
B = A(:,:, ・・・ ,:,idx,:, ・・・ ,:,:);
Aの次元Nはi以上の任意の値で,iは予め指定された値である場合,
配列Bを得る方法はございますでしょうか.
現在,私は以下のような方法で計算しておりますが,コマンド「eval」を用いて力技でしのいでいる感じで,最適な方法が他にあるのでは,と考えております.
N = length(size(A));
idx = [3 10 15 28];
i = 3;
buf = 'A(';
for s = 1:N
if s == i
buf = [buf 'idx'];
else
buf = [buf ':'];
end
if s < N
buf = [buf ','];
end
end
buf = [buf ')'];
B = eval(buf);
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
もしかするともう解決しているかも知れませんが…
個人的にはind2subとかをうまく使えばできるような気がしていたのですが、
ind2sub内もnargoutで制御されているのでNを自由に変えるのには向いていません。
ind2subと同じ処理を自分で書いて出力をセル配列か2次元配列で出せるようにすれば
できるかも知れませんがそこまでするのも…という感じです。
ただ、evalに入れるbufを少しずつ連結させながら増やしていくというのもなんかいたずらに
行数がかかってしまうので嬉しくないですね。
ということでshiftdimを使って、取り出したいindexを自分の好きな場所に動かしてしまえば、
いちいち取り出したいindexかどうかのif文も要らなくなりそうなので楽ですね。
あとlength(size(A))はndims(A)で実現できますので見た目すっきりします。
(どちらが速いかはわかりませんが…)
ということで書いてみました。
A=rand(3,4,5,6,7);
N=ndims(A);
k=3;
idx=[1 3];
tmp=shiftdim(A,k-1);% k次元を一番最初の次元に持ってくる
Sa=size(A);
st=size(tmp);
buf=['tmp(idx' repmat(',:',1,N-1) ');'];
B=shiftdim(eval(buf),N-k+1);% evlaで取りだした後、次元を元に戻す
Sb=size(B);
私自身が「Matlabでfor文を使いたくない教」の熱烈な信者ですので(笑)
若干トリッキーな感じになってるかも…
処理速度などは検討していません。結局evalから逃げるのは難しそうですね…
ind2subを使った方法がうまくできればいいのですが。
参考になれば幸いです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- Visual Basic(VBA) このマクロの説明文を教えてほしいです。 1 2023/01/12 09:17
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- その他(プログラミング・Web制作) pandasでまとめてインデックスを削除するにはどうすればいいですか? たとえば、以下のプログラムで 1 2022/07/31 23:09
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) オブジェクトが見つかりません 1 2023/06/24 19:43
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) VBA エクセル 条件の設定 1 2022/03/28 10:24
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたい 6 2023/01/23 12:00
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】看板の文字を埋めてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・【穴埋めお題】恐竜の新説
- ・我がまちの「給食」自慢を聞かせてっ!
- ・冬の健康法を教えて!
- ・一番好きな「クリスマスソング」は?
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列数式の解除
-
特定のセル範囲で4文字以上入力...
-
for each の現在の配列ポインタ...
-
2つ以上の変数を比較して最大数...
-
2次元動的配列の第一引数のみを...
-
ListViewで、非表示列って作れ...
-
VB6 配列を初期化したい
-
Excel VBA配列をFunctionに渡す
-
Excel-VBAの配列「Public Const...
-
VBのFunctionで、配列を引数...
-
行列の積の計算プログラムを教...
-
Dim は何の略ですか?
-
《エクセル2000》A列・B列の商...
-
配列変数の添字が範囲外ですと...
-
MATLABにて場合分け関数を定義...
-
subの配列引数をoptionalで使う...
-
verilogで配列の任意の8bitを取...
-
エクセルで最小値から0を除く方法
-
配列を任意の数値で埋める方法
-
FORTRANのCOMMON文
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列数式の解除
-
2つ以上の変数を比較して最大数...
-
特定のセル範囲で4文字以上入力...
-
配列変数の添字が範囲外ですと...
-
ListViewで、非表示列って作れ...
-
VBA 1次元配列を2次元に追加する
-
VB6 配列を初期化したい
-
subの配列引数をoptionalで使う...
-
配列を任意の数値で埋める方法
-
for each の現在の配列ポインタ...
-
エクセルで最小値から0を除く方法
-
2次元動的配列の第一引数のみを...
-
VBのFunctionで、配列を引数...
-
Excel-VBAの配列「Public Const...
-
《エクセル2000》A列・B列の商...
-
linest関数に配列を渡す
-
VBAで近似曲線の係数取得
-
配列内の内容を全て表示する方法
-
Excel VBA配列をFunctionに渡す
-
AES暗号にて、AES_set_encrypt_...
おすすめ情報