変数名に対応した規則性のあるベクトルの作成と ベクトルの結合
5 views (last 30 days)
Show older comments
nを設定し,i=1:(n-1)/2,j=0:(n-1)
以下のような規則性のあるベクトルをfor文等を用いて生成する方法はありますでしょうか。
また,できれば,三角関数は計算せず,πで表現した形で出力させたいです。(sin(π)→ ○sin(π) ×1.0)
0 Comments
Answers (2)
Hiro Yoshino
on 28 Aug 2023
文字のまま残すのは、symbolic math などを使われると良いかと思います。
(私がやろうとしたら上手く出来なかったので、ここでは行列の作り方だけお示しします)
n = 10
i = (1:(n-1)/2) % 行ベクトル
j = (0:(n-1))' % 列ベクトル
N = zeros(length(j),length(i)); % 先にメモリを確保
N = sin(j*i*2*pi/n) % N の計算はこんな風に出来るのでは?
0 Comments
ayumi obitsu
on 28 Aug 2023
Edited: ayumi obitsu
on 28 Aug 2023
4 Comments
Hiro Yoshino
on 29 Aug 2023
上で示した様に行列を定義できるのは、MATLAB のユニークな特徴だと私は思っています。他の言語だと for loop で計算するケースが多いと思いますので、かなり楽できますよね!
3行のコマンドで
を作成されています。このアイディアをそのまま使えば、
も同様に作成可能です。これは大丈夫ですか?
あと、任意の順番に変更するのも簡単に実現可能です。
n = 10;
i = (0:(n-1)/2); % 行ベクトル
j = (0:(n-1))'; % 列ベクトル
例えば、i の順番を以下のようにランダムに変更します
idx = randperm(length(i));
i = i(idx)
計算します (ほぼ答えですが...)
Ns = sin(j*i*2*pi/n) * sqrt(2/n);
Nc = cos(j*i*2*pi/n) * sqrt(2/n);
N = [Ns, Nc] % 交互に混ぜれば所望の行列...
あとは、Ns, Nc を交互に配置するだけです ... 色々やり方が有ると思います。
cos, sin の細かいインデックスの調整はご自身行っていただけると思うので、ここまでにしておきます。
@ayumi obitsu さんには余計な話かも知れませんが、任意の列ベクトルを取り出したい場合は、i や j のベクトルを、任意の数値1つにすれば計算出来ます。私が示した方法は、1つ1つ取り出すのは面倒くさいから、一気にやってしまうというものです。for loop だと遅いので、for loop 無しで実現出来る計算方法です。MATLAB っぽい書き方で、他の言語に馴染みが有ると、最初は違和感があるかも知れません。
See Also
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!