質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

Q&A

解決済

2回答

1055閲覧

matlabでfor文を使った列の結合

Hoshi0331

総合スコア2

MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

0グッド

0クリップ

投稿2022/03/16 03:50

a1からa36の1000行のdoubleタイプの配列があります。

forループで1から36を回して縦に並んだ配列同士を横に連結させ、
最終的に1000×36のdouble型の配列を作りたいと思っています。

catやhorzcatを使って試してみたのですがうまくいかず、
どなたかわかる方教えていただければ幸いです。

どうぞよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2022/03/16 05:09

「a1からa36の1000行のdoubleタイプの配列」はそもそもどうやって用意したんですか?
jbpb0

2022/03/16 11:52

こんな感じ? a1 = ones(5, 1) * 0.1 a2 = ones(5, 1) * 0.2 a3 = ones(5, 1) * 0.3 aa = [a1 a2 a3]
Hoshi0331

2022/03/16 22:38

ozwk様 ご返信・ご質問ありがとうございます。 「a1からa36の1000行のdoubleタイプの配列」は、元々あった長い配列のデータを1000行ごとに切り取って作りました。 私の昨日の質問の仕方がかなりわかりづらかったと思いますので追記すると、 a1=1000行、a2=1000行、...a36が=1000行という感じなのですが、 a=[a1 a2 ...a36]と配列同士を横方向に繋げると少し長いこと・今後もっと多くの配列同士を連結させる時に困ることから、このようなご質問させていただきました。 どうぞよろしくお願い致します。
Hoshi0331

2022/03/16 22:42

jbpb0様 ご返信・ご回答ありがとうございます。 はい、配列の大枠としてはそのような感じになります。 (aaでまとめている配列の数が増えた場合に、forで回したいと思っております。)
ozwk

2022/03/16 23:47

「元々あった長い配列のデータ」とやらを加工すればいいと思います。
Hoshi0331

2022/03/17 00:42

ozwk様 ご返信ありがとうございます。 「元々あった長い配列データ」を切り出す際に、切り出しはじめと切り出し終わりをそれぞれ指定して切り出していることから、直接の加工(連結)が難しいか?と思いご質問させていただいた次第でした。 追記の情報が多くて申し訳ありませんが、もしa=[a1 a2 ...a36]の番号部分をforループで回して多数の配列を連結させる方法をご存じでしたら、教えていただけましたら幸いです。
jbpb0

2022/03/17 03:14 編集

> a=[a1 a2 ...a36]の番号部分をforループで回して多数の配列を連結させる方法 a1 = ones(10, 1) * 0.1; a2 = ones(10, 1) * 0.2; a3 = ones(10, 1) * 0.3; a4 = ones(10, 1) * 0.4; a5 = ones(10, 1) * 0.5; aa = []; for num = 1:5 %disp(num) str = ['aa = [aa a', num2str(num), '];']; disp(str) eval(str) end disp(aa) みたいな感じ? 参考 https://jp.mathworks.com/matlabcentral/answers/723833-for
Hoshi0331

2022/03/17 02:42

jbpb0様 できました! 大変わかりやすくありがとうございます! jbpb0様 ozwk様 今回はご回答くださりありがとうございました。 初歩的な質問になってしまっていたこと、ご回答いただいてからわかったのですが、大変勉強になりました。 貴重なお時間くださり感謝しております。
Hoshi0331

2022/03/17 03:20

jbpb0様 追記ありがとうございます。 こちらの方でもできました。
guest

回答2

0

ベストアンサー

a=[a1 a2 ...a36]の番号部分をforループで回して多数の配列を連結させる方法

matlab

1a1 = ones(10, 1) * 0.1; 2a2 = ones(10, 1) * 0.2; 3a3 = ones(10, 1) * 0.3; 4a4 = ones(10, 1) * 0.4; 5a5 = ones(10, 1) * 0.5; 6 7aa = []; 8for num = 1:5 9 %disp(num) 10 str = ['aa = [aa a', num2str(num), '];']; 11 disp(str) 12 eval(str) 13end 14 15disp(aa)

参考
変数の生成 for分

投稿2022/03/20 12:01

jbpb0

総合スコア7651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hoshi0331

2022/03/23 04:15

jbpb様 いつも大変わかりやすいご回答、ありがとうございます。一つ追加で質問を失礼いたします。 例えば、a1からa5が既にセル配列で、取り出したい行をaa{1,i}(:,1)などと中かっこを用いて取り出したい場合、どのようなコードを記載すればよいか?などご存じでしょうか? ※中かっこを num2str のインデックスに使用することはできません。 とのエラーが出てしまいました。 もしご存じでしたら教えていただければ幸いです。 どうぞよろしくお願いいたします。
jbpb0

2022/03/23 06:55

> a1からa5が既にセル配列で、 この質問とは前提条件が違うので、違う質問にしてください
guest

0

「a1からa36の1000行のdoubleタイプの配列」は、元々あった長い配列のデータを1000行ごとに切り取って作りました。

a1, a2, .... , a36を用意しようと思ったら、もともとの配列をAだとして

matlab

1a1 = A(1:1000); 2a2 = A(1001:2000); 3... 4a36 =A(35001:36000);

と36行も似たようなことを書くわけですよね?
a1, a2, .... , a36がどうしても必要ならば仕方ありませんが、
多分最終的にほしいのは1000x36の配列であって36個の1000x1配列はその手段として考えただけだと思います。

とすると、

matlab

1a = reshape(A, [], 36);

で済みます。


Aから切り出すポイントが異なるということですが、切り出すポイントは機械的に決定可能でしょうから、

a = [] for i = 1 : 36 // この「36」も多分計算で決められるはず、切り出すまで回数がわからないならwhile文にしてください temp = /*(A から i 番目を切り出す処理)*/ a = [a, temp]; end

ランダムに切り出すなら

matlab

1A=(1:2000)'; 2N=10; 3L=4; 4a=[]; 5for i=1:N 6 start = randi(length(A)-L); 7 temp = A(start:start+L-1); 8 a=[a,temp]; 9end 10 11a 12% 4 x 10

投稿2022/03/17 00:35

編集2022/03/22 01:27
ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hoshi0331

2022/03/17 00:54

ozwk様 ご返信&大変わかりやすいご回答、感謝しております! (上の追記・修正依頼の部分への返信がすれ違ってしまいまして大変申し訳ありません。) しかし、a1,a2,a3の配列に関しては、長さは一緒なのですがそれぞれ切り出し始めのポイントが異なっており、その配列は別々に切り出す以外方法がない、という少々面倒くさい配列になってしまっております。 ただ、a = reshape(A, [], 36); この方法は知らなかったのでとても勉強になりました。ありがとうございます!
Hoshi0331

2022/03/17 03:07

ozwk様 追記してくださり、ありがとうございます。 このように機械的に切り出す方法があることをはじめて知りました。 ただ、今回のデータ(生理データになります。)ですと、切り出すポイントが36試行全てランダムで、機械的に切り出すという事が難しくなっております。 しかし、追記していただいた方法試してみて、今後データの切り出し作業をするに当たって、大変参考になるということがわかりました。 本当にありがとうございます!
ozwk

2022/03/17 06:04 編集

> 切り出すポイントが36試行全てランダムで ? 乱数で開始地点を決めるならなおさら簡単に抜き出せると思いますが... start = 乱数で開始インデックスを作る temp = A(start:start+1000);
Hoshi0331

2022/03/20 22:31

ozwk様 こちら、ありがとうございました。 返信が遅れてしまい申し訳ありません。 このような方法もあるのですね。 しかし、私の表記が悪かったのですが、 例えば、temp = A(start+1000:start+2000);でしたら、 1000と2000の部分が切り出す長さは変わらず毎回変わるという感じになっております。 ただ、このような方法があること、大変参考になりました。 ありがとうございます!
ozwk

2022/03/21 22:13 編集

start = randi(N) とすれば この行を実行するたびにstartが1~Nのランダムな整数になります。 実際やってみると抜き出す範囲が [1406 : 2406] [5972 : 6972] [2585 : 3585] [6363 : 7363] [715 : 1715] ... みたいにランダムに変わります。
Hoshi0331

2022/03/23 01:29 編集

ozwk様 追記、ありがとうございます。 以前、他のプログラムを書いていた際にこのような方法探していたことがありました。 そちらのプログラムで上記の方法を用いて、実際に書き換えることができました。 いつも大変感謝しております!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問