変数名に対応した規則​性のあるベクトルの作​成と ベクトルの結合

7 views (last 30 days)
ayumi obitsu
ayumi obitsu on 28 Aug 2023
Commented: ayumi obitsu on 29 Aug 2023
nを設定し,i=1:(n-1)/2,j=0:(n-1)
以下のような規則性のあるベクトルをfor文等を用いて生成する方法はありますでしょうか。
また,できれば,三角関数は計算せず,πで表現した形で出力させたいです。(sin(π)→ ○sin(π) ×1.0)

Answers (2)

Hiro Yoshino
Hiro Yoshino on 28 Aug 2023
文字のまま残すのは、symbolic math などを使われると良いかと思います。
(私がやろうとしたら上手く出来なかったので、ここでは行列の作り方だけお示しします)
n = 10
n = 10
i = (1:(n-1)/2) % 行ベクトル
i = 1×4
1 2 3 4
j = (0:(n-1))' % 列ベクトル
j = 10×1
0 1 2 3 4 5 6 7 8 9
N = zeros(length(j),length(i)); % 先にメモリを確保
N = sin(j*i*2*pi/n) % N の計算はこんな風に出来るのでは?
N = 10×4
0 0 0 0 0.5878 0.9511 0.9511 0.5878 0.9511 0.5878 -0.5878 -0.9511 0.9511 -0.5878 -0.5878 0.9511 0.5878 -0.9511 0.9511 -0.5878 0.0000 -0.0000 0.0000 -0.0000 -0.5878 0.9511 -0.9511 0.5878 -0.9511 0.5878 0.5878 -0.9511 -0.9511 -0.5878 0.5878 0.9511 -0.5878 -0.9511 -0.9511 -0.5878

ayumi obitsu
ayumi obitsu on 28 Aug 2023
Edited: ayumi obitsu on 28 Aug 2023
回答していただき,ありがとうございます。
私の質問が分かりにくかったのが悪いのですが,
n0c,n(i)c,n(i)sはそれぞれ違う式となっています。
また,n0cのみ第一列にあり,その後はn(i)c,n(i)sが並ぶ形となります。したがって,正方行列になります。
  4 Comments
Hiro Yoshino
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)
i = 1×5
4 3 2 1 0
計算します (ほぼ答えですが...)
Ns = sin(j*i*2*pi/n) * sqrt(2/n);
Nc = cos(j*i*2*pi/n) * sqrt(2/n);
N = [Ns, Nc] % 交互に混ぜれば所望の行列...
N = 10×10
0 0 0 0 0 0.4472 0.4472 0.4472 0.4472 0.4472 0.2629 0.4253 0.4253 0.2629 0 -0.3618 -0.1382 0.1382 0.3618 0.4472 -0.4253 -0.2629 0.2629 0.4253 0 0.1382 -0.3618 -0.3618 0.1382 0.4472 0.4253 -0.2629 -0.2629 0.4253 0 0.1382 0.3618 -0.3618 -0.1382 0.4472 -0.2629 0.4253 -0.4253 0.2629 0 -0.3618 0.1382 0.1382 -0.3618 0.4472 -0.0000 0.0000 -0.0000 0.0000 0 0.4472 -0.4472 0.4472 -0.4472 0.4472 0.2629 -0.4253 0.4253 -0.2629 0 -0.3618 0.1382 0.1382 -0.3618 0.4472 -0.4253 0.2629 0.2629 -0.4253 0 0.1382 0.3618 -0.3618 -0.1382 0.4472 0.4253 0.2629 -0.2629 -0.4253 0 0.1382 -0.3618 -0.3618 0.1382 0.4472 -0.2629 -0.4253 -0.4253 -0.2629 0 -0.3618 -0.1382 0.1382 0.3618 0.4472
あとは、Ns, Nc を交互に配置するだけです ... 色々やり方が有ると思います。
cos, sin の細かいインデックスの調整はご自身行っていただけると思うので、ここまでにしておきます。
@ayumi obitsu さんには余計な話かも知れませんが、任意の列ベクトルを取り出したい場合は、i や j のベクトルを、任意の数値1つにすれば計算出来ます。私が示した方法は、1つ1つ取り出すのは面倒くさいから、一気にやってしまうというものです。for loop だと遅いので、for loop 無しで実現出来る計算方法です。MATLAB っぽい書き方で、他の言語に馴染みが有ると、最初は違和感があるかも知れません。
ayumi obitsu
ayumi obitsu on 29 Aug 2023
返信ありがとうございます。 わかりました。ご丁寧にありがとうございます。

Sign in to comment.

Products

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!