こんにちは、Matlabを使い始めのものです。
二行の行列(2x10とか2x40など)にについて、一行目をx座標、二行目をy座標としてグラフ化したいのですが、うまくいきません。
自動的にx座標は列の番号となり、二つのグラフが現れてしまいます:y座標に一行目、二行目、両方がプロットされてしまいます。どうにか、一行目をx、二行目をy座標としてグラフ化できないでしょうか。おそらく、とても単純なことなのかもしれないのですが、どうしてもわからず、とても歯がゆい思いをしています・・・。どうかご教示ください。

何をしたいかといいますと、音声データをMatlabで取り込んだのですが、振幅データがずらっと並んだ、1x500000とかの行列が得られます。
これを、プロットすると、x軸はサンプル番号が並ぶわけですが、本当はx軸は時間であって欲しいため、音声データの行列にひとつ行を足して、時間軸を作ってあげました。つまり、今手元にあるのは、2x500000の行列で、一行目が時間、二行目が振幅となっています。これをx軸が時間軸、でy軸が振幅となるようにグラフ化してあげたいと考えています。

文章がわかり辛くて申し訳ないのですが、何卒よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

xを2行×N列のマトリクスとして、



figure(1)
plot(x(1,:),x(2,:))
hold on

か分かりやすく、
figure(1)
u=x(1,:);
v=x(2,:);
plot(u,v)
hold on

でいいかと。
    • good
    • 1
この回答へのお礼

できました! ところで、x(1,:)ではなく、x(:,1)では
ないでしょうか。

有難う御座いました!!!

お礼日時:2009/05/18 15:22

よかったですね。



>できました! ところで、x(1,:)ではなく、x(:,1)ではないでしょうか。

2行×N列の場合x(1,:)です。x(:,1)は2行×1列の行列です。もし後者でグラフ表示が正しければ、元行列サイズはN×2だと思います。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qmatlabで複数条件のif文を行列計算で行うには?

matlabで複数条件のif文を行列計算で行うには?

matlabではfor文などは行列計算で回したほうが高速化できると聞きました。
for文でのやりかたはわかったのですが、複数条件でのif文ではどのように書けばよいのでしょうか?

自分のプログラムは以下のようなものです


for i=1:100
for j=1:100
theta_kari=atan(abs(B(j,i))/abs(A(j,i)));
if A(j,i)>=0&&B(j,i)>=0
theta(j,i)=theta_kari;
elseif A(j,i)<0&&B(j,i)>=0
theta(j,i)=theta_kari+(pi/2);
elseif A(j,i)<0&&B(j,i)<0
theta(j,i)=theta_kari+pi;
elseif A(j,i)>=0&&B(j,i)<0
theta(j,i)=theta_kari+(pi/2*3);
end
end
end

よろしくお願いします

matlabで複数条件のif文を行列計算で行うには?

matlabではfor文などは行列計算で回したほうが高速化できると聞きました。
for文でのやりかたはわかったのですが、複数条件でのif文ではどのように書けばよいのでしょうか?

自分のプログラムは以下のようなものです


for i=1:100
for j=1:100
theta_kari=atan(abs(B(j,i))/abs(A(j,i)));
if A(j,i)>=0&&B(j,i)>=0
theta(j,i)=theta_kari;
elseif A(j,i)<0&&B(j,i)>=0
theta(j...続きを読む

Aベストアンサー

matlab的に一番速いのは

theta = atan(abs(B./abs(A)) + (A<0 & B>=0)*pi/2 + (A<0 & B<0)*pi + (A>=0 & B>=0)*(pi/2*3);

ですかね。

QMatlab 指定したディレクトリからのload

Matlab初心者です、よろしくお願いします。

Matlabであるmatファイルを1000個作りました。それぞれのファイル名は1~1000.matのような感じです。
中身はすべて7*250の配列で、それぞれ異なる値が入っています。
これまではfor文を使ってiをstring型にしてからloadで読み込んで、値を用いて計算するのを繰り返していました。

しかしこのままカレントディレクトリに1000個もmatファイル置いておくと、とても作業がしづらく邪魔です。

例えばこれを1つにまとめて使う方法や、うまいload方法、違うディレクトリを作成して、load時のみそのディレクトリを参照する方法などありましたら、ご教授していただけると助かります。

よろしくお願いします。

Aベストアンサー

load foo/10.dat
とか書けば,subdirectory foo を見に行くし.
load ../foo/10.dat
とかかけば,1こ上のディレクトリの下の foo ディレクトリのデータを読むし,

ウィンドウズなら,
load d:/Temp/10.dat
で d ドライブ Temp ディレクトリの 10.dat を load します.

QMATLAB で 連番処理をしたい

matalabで画像処理をしたいのですが、 同じ処理を複数回、違う変数に対して行いたいのですがやり方がよくわからりません。

たとえば、
[output1 ,model_color1] = func_AAAA( imgdata,center1);
[output2 ,model_color2] = func_AAAA( imgdata,center2);

[output10 ,model_color10] = func_AAAA( imgdata,center10);
というようなことを行いたいのですが、
いちいち全部記述すると
output5までしかいらない時にわざわざ6~10を消さなければならないので
for文を使って書けるようにしたいと考えています
イメージとしては下のように処理したいのですがこれでは当然エラーになります。
for NUM=1:10
[outputNUM ,model_colorNUM] = func_AAAA( imgdata,centerNUM);
end

num2strを使えばできそうな感じがするのですがどのようにすればよいでしょうか?
お願いします

matalabで画像処理をしたいのですが、 同じ処理を複数回、違う変数に対して行いたいのですがやり方がよくわからりません。

たとえば、
[output1 ,model_color1] = func_AAAA( imgdata,center1);
[output2 ,model_color2] = func_AAAA( imgdata,center2);

[output10 ,model_color10] = func_AAAA( imgdata,center10);
というようなことを行いたいのですが、
いちいち全部記述すると
output5までしかいらない時にわざわざ6~10を消さなければならないので
for文を使って書けるようにしたいと考えています
...続きを読む

Aベストアンサー

cell array を使って,

for NUM=1:10
[output{NUM} ,model_color{NUM}] = func_AAAA( imgdata,center{NUM});
end

こんな感じに書けば,loop できる

doc の matlab-> Programing -> Data Types -> Cell Arrays
辺りを参考にすること.

QMATLABのsaveでファイル名を試行ごとに変えたい

MATLABを使ってるんですが,変数を保存するとき,
saveコマンドで,
save 'filename.txt' A -ASCII -TABS
で,Aのデータがfilename.txtに保存されますよね.
で,このfilenameの名前を試行ごとに変えたいのですが,やりかたが分からないので教えてほしいです.
想像だと,
save 'filename%d.txt' ~
みたいな感じで毎回違う数字をファイル名に入力できるかと考えたんですが,書き方がわかりませんでした.

もしくは,ファイルを出力するフォルダを指定する方法などもわかるとうれしいです.

お願いします.

Aベストアンサー

自分で作ったプログラムソースから抜粋しました。

自分は画像処理を行って、画像330枚をひとつのディレクトリに
書き出しています。

d = dir('cars/*.jpg');

こうすることで、カレントディレクトリにあるcarsというディレクトリ
のファイル(.jpg)の情報を全て構造体として d に書き出します。
あらかじめcarsを作っておきます
構造体の中身は
d.name 'car0004.jpg' //ファイル名
d.data '25-9-2008...'//日付
d.byte '4996' //バイト
d.isdir '0'
d.num 7.4e^...
といった情報が入っています。実際に試してみてください。

maisu=1;
kakidashi=['kensa330/' d(maisu).name];

これでkensa330というフォルダの位置と名前を指定することができます。
workspaceには kakidasi='kensa330/car0004.jpg'となります。

maisuをfor文などでまわすことでcar0001.jpg car0002.jpg ...
と順次新しく変換されます。

あとはがんばってください。

自分で作ったプログラムソースから抜粋しました。

自分は画像処理を行って、画像330枚をひとつのディレクトリに
書き出しています。

d = dir('cars/*.jpg');

こうすることで、カレントディレクトリにあるcarsというディレクトリ
のファイル(.jpg)の情報を全て構造体として d に書き出します。
あらかじめcarsを作っておきます
構造体の中身は
d.name 'car0004.jpg' //ファイル名
d.data '25-9-2008...'//日付
d.byte '4996' //バイト
d.isdir '0'
d.num 7.4e^.....続きを読む

QMATLABで行列を配列に格納する方法

MATLAB初心者で大変申し訳ありませんが、行列の格納の仕方がわからないので、投稿させていただきました。

for k = 1:1:10
k=k;
t(:,:)=load(sprintf('test%5.5i.txt',k));
end
具体的に言いますと、上記のプログラムで、test00001~test00010.txtというファイルを任意の行列t(:,:)で読み込んでいるのですが、このt(:,:)をkと対応させて、例えばk=1の場合のtをt[1]、k=2の場合のtをt[2]などの配列に格納し、それを自由に呼び出し、計算を行いたいと考えております。
基礎がわかっていないためにどうしていいかわかりません。
宜しく御願いします。

Aベストアンサー

構造体を使うのが一番スマートでしょうか。

for k = 1:10
 FILE_DATA(k).t(:, :) = load(sprintf('test%5.5i.txt', k));
end

これで、FILE_DATA(1)~FILE_DATA(10)それぞれに行列tが格納されます。

QMatlabでforやifを使わずに条件に合う行番号の抜き出し方

仮にA=[1 0 1 0 0 1]の行ベクトルがあったとします。
forやifを使わずにAにおいて1が入っている行番号(この場合では1,2,5)を抜き出すにはどうしたらいいのでしょうか。よろしくお願いします。

Aベストアンサー

index = find(A == 1);

で大丈夫かと。

QMATLABにて場合分け関数を定義したい

MATLABの超初心者です.
関数f(x)を定義域により,違う関数で定義したいと考えています.
つまり,
f(x)= f1(x) if x<=5
= f2(x) if x>5

という感じです.なにぶん初心者のため,何を調べればよいのやら途方に暮れています.アドバイスお願いします

Aベストアンサー

いろんなレベルがあるけど x に配列を要求しないなら,
function [y] = foo1(x)
if (x<=5)
y = cos(x);
else
y = sin(x);
end

みたいで良いし, x に配列が入る場合は,

function [y] = foo2(x)

I = find(x<=5);
J = find(x>5);
y = zeros(size(x));
y(I) = x(I).^2 - 2;
y(J) = -2*x(J).^2 + x(J) + 20;

の様な関数でどないでしょう.

QMATLABのCSV形式での書き込みについて

MATLABにて計算させた結果をCSV形式で出力したいのですが,
もともとCSVファイルに書き込んであるデータを消さずに,
追加書き込みとして,行と列を指定して書き込み出来るのでしょうか?

もしできるのであれば,
どのようなプログラムを組めばよいのでしょうか?
どなたかご教授お願いします.

Aベストアンサー

speedとpowerはdouble型の行列ですよね?

fwrite関数はバイナリ保存関数ですので、CSV形式(=テキスト形式)での保存はできません。
dlmwrite関数では小数点以下12桁までを指定して保存していますので、fprintf関数を使用すれば良いのではないかと思います。
なお、fprintf関数を使用する場合は、区切文字(,)や改行は自動で追加されませんので、以下のように記述する必要があります。

fprintf(fid, '%.12f,', speed);
fprintf(fid, '\n');
fprintf(fid, '%.12f,', power);
fprintf(fid, '\n');

ただ、この方法では各行の末尾にもカンマが出力されますので、それを抑止したい場合は、speedとpowerの各要素をループの中で保存してください。

■ fprintf関数
http://infoshako.sk.tsukuba.ac.jp/InfoRes/jdoc/MATLAB5/jhelp/techdoc/ref/fprintf.html


また、プログラムではfor文の中でfopenとfcloseを繰り返していますが、余り良いことではありません。見たところファイル名は一定のようですので、fopenとfcloseはfor文の外でするべきだと思います。そうすれば処理速度も向上しますし、別に追記でfopenする必要もありません。

fid = fopen('file1.csv', 'w');
for
fprintf(fid, ....);
end
fclose(fid);


最後に、この場合はファイルの出力方法を変更する以外に、speedとpowerをループ回数分保存するように変更する方法もあるのではないかと思います。

speedとpowerはdouble型の行列ですよね?

fwrite関数はバイナリ保存関数ですので、CSV形式(=テキスト形式)での保存はできません。
dlmwrite関数では小数点以下12桁までを指定して保存していますので、fprintf関数を使用すれば良いのではないかと思います。
なお、fprintf関数を使用する場合は、区切文字(,)や改行は自動で追加されませんので、以下のように記述する必要があります。

fprintf(fid, '%.12f,', speed);
fprintf(fid, '\n');
fprintf(fid, '%.12f,', power);
fprintf(fid, '\n');

た...続きを読む

QMATLABで小数を整数にするには?

タイトル通りなんですがMATLABで小数の値を小数点以下切捨てなどで整数にする方法はありますか?

Aベストアンサー

floorとかroundを使えばいいんじゃないでしょうか?
正の数であれば、floorが切り捨て、roundが四捨五入です。

参考URL:http://dl.cybernet.co.jp/matlab/support/manual/r13/toolbox/matlab/ref/floor.shtml

QMATLAB(マトラボ)とcsvファイルについて

マトラボで、文字列を含む、csvファイルを読み込み、データをプログラムに使用したいのですが、どうしたらいいですか?
csvread('filename')ではできませんでした。
どなたか、ご教授くださいませ。

Aベストアンサー

Excelで読み込んで、xlsファイルにセーブして、
xlsreadでmatlabに読み込むとか。
http://dl.cybernet.co.jp/matlab/support/manual/r13/toolbox/matlab/ref/?/matlab/support/manual/r13/toolbox/matlab/ref/xlsread.shtml


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報