MATLABプログラミング 質問箱 その2

このエントリーをはてなブックマークに追加
932デフォルトの名無しさん:2009/04/25(土) 03:21:07
>>931
こぴられたw

>>930
時間変化しない3次元のデータだったらプロットの仕方はわかる?
それがわかれば、あとは一定時間で区切って再描画コマ送りするなり、
それをアニメーションとして保存するなり、お好きなように
933デフォルトの名無しさん:2009/04/25(土) 12:20:08
Cソースで書くS-Functionで、複数のデータ型を含むバス信号を入力として
受け取りたいのですが、方法が見つかりません。
もしかして、S-Functionではデータ型が混在するバスやベクトル信号は
受け付けられないのでしょうか?
もし受け付ける方法があるなら教えていただけないでしょうか?
よろしくお願いします。
934デフォルトの名無しさん:2009/04/26(日) 00:42:40
>>933
ポートをわけて渡さないとダメじゃないかなあ
935デフォルトの名無しさん:2009/04/26(日) 21:49:55
>>934
やはりそうですか・・・
データ型を取得するマクロがポート単位のものしかないですもんね・・・
複数データ型のバスを受け取らなくても良い方法を考えることにします。
ありがとうございました。
936デフォルトの名無しさん:2009/04/27(月) 10:07:32
>>932
その都度figureを立ち上げてコマ送りのように表示することはできたのですが、もう少しスマートにできないものでしょうか??
一定時間で区切りコマ送りする手法を教えていただきたいです。
937デフォルトの名無しさん:2009/04/27(月) 10:21:12
938デフォルトの名無しさん:2009/05/18(月) 01:03:00
差分方程式
x(n+2)+a_1x(n+1)+a_0x(n)=0 ,
x(0)=x_0 , x(1)=x_1 , n=0,1,2,∙∙∙
の階x(k)=0,1,2,∙∙∙,t_fを求めるプログラミングを作成せよ。また、次のデータについて実行せよ。
a_0=0.3 . a_1=-1.5 , x(0)=1 , x(1)=2 , t_f=10

のプログラムが作れません。誰か教えてください!お願いします!!
939デフォルトの名無しさん:2009/05/18(月) 20:26:05
質問です

みなさんマトラボはいつ頃から勉強はじめました?

ぜひ教えてください
940デフォルトの名無しさん:2009/05/18(月) 20:51:54
>>939
初めて触れたのは学部4年前期の制御工学の授業
941デフォルトの名無しさん:2009/05/18(月) 21:29:00
>>939
大学2年から
942デフォルトの名無しさん:2009/05/18(月) 21:32:26
>>938
久々のレスが宿題かよ!
x(n+1)+a_1x(n)=0, X(0)=X_0
なら作れる?
>>939
おれも940と同じ
943デフォルトの名無しさん:2009/05/19(火) 10:26:37
>>939
院にいってから
944デフォルトの名無しさん:2009/05/19(火) 18:42:03
ちょっと質問させてください。

assignin関数でfunction 内の変数をWorkSpaceに置きたいんですけど、
その際に変数名を配列で指定するとエラーがでて出来ません。
何か良い方法はないですかね?

こんな感じで書いてます。

function hoge
str =[ test1 test2 ]
for i=1:2
  assignin('base',str(1,i), 2); ←ここでエラー
end

よろしくお願いします。
945デフォルトの名無しさん:2009/05/19(火) 19:21:18
三つアドバイス。
1. エラーメッセージをしっかり読む
2. ブレークポイントを設定して、関数実行時の変数の中を見てみる
3. 文字配列とセル配列の違いと扱い方を体で覚える

function hoge

str = { 'test1' 'test2' };
for k = 1:length(str)
assignin('base', str{ks}, 1);
end

あと、matlab では i は虚数を意味する(i * i = -1)ので、
できるだけカウンタとしての使用は避けるべきなのだそうな。
標準的な関数群でも平気で i がカウンタとして使われているけれども。
946デフォルトの名無しさん:2009/05/19(火) 19:22:46
ごめん typo があった。

function hoge

str = { 'test1' 'test2' };
for k = 1:length(str)
assignin('base', str{k}, 1);
end
947デフォルトの名無しさん:2009/05/19(火) 20:17:52
>>945-946
素早く丁寧な返事をありがとうございます。

1と2に関しては実行しました。
エラー文は読んだのですが、不適切な文ですとしか出ず
str(1,i)を 'test1' におきかえると正しく動作したので、str(1.i)が
間違っているということはわかったのですが、そこから進まなくて・・・。
セル配列{}? と文字配列()の違いでエラーが出てたという事ですかね?
str(1,1)とコマンドラインに入れればtest1 が帰ってきたので、
eval(str(1,1))
などを入れてやれば解決するかなと考えたのですが、これでもうまくいかず・・・。

また、明日学校で試させてもらいます。ありがとうございました。
948デフォルトの名無しさん:2009/05/19(火) 20:59:28
この例題なら自宅でOctave使って試すこともできるぜ
949デフォルトの名無しさん:2009/05/19(火) 22:21:51
>>948
お勧めされたので早速やってみました。
実は質問外なので省いたのですが、最初の
str = { 'test1' 'test2' };
を取ってくる際にimportdataを用いてエクセルファイルのヘッダを取得しているのですが、
その辺りの関数がOctaveにはないようですね。

ただ、上記の関数がOctave上で正しく動くことは確認できました。ありがとうございます。
明日学校でMATLAB上でも正しく動くか検証してみます。
950デフォルトの名無しさん:2009/05/20(水) 01:22:36
すごく初歩的な質問ですまんが


%f(x)=x^2-5
N0=100;
TOL=0.0000001;
XL=1;
XR=5;
i=1;
FXL=XL^2-5;

while (i<N0)
XM=(XL+XR)/2;
FXM=XM^2-5;
if (XM==0 | (XR-XL)/2<TOL)
disp(XM);
return;
end
i=i+1;
if (FXL*FXM>0)
XL=XM;
FXL=FXM;
else
XR=XM;
end
end
disp('解が得られない');

このプログラムを関数x^3-7x^2+14x-6で動かしたいんだけど、どこをどう書き換えればいいのかわからん
自分でやるといつもFXM=のところでエラーになる
教授から丸投げされて、もうお手上げ状態なんで誰かアドバイスください
951デフォルトの名無しさん:2009/05/20(水) 19:28:56
>>950

学校のPCからじゃ書き込めないから携帯からになるけど

7行目を
FXL = XL^3-7*XL^2+14*XL-6

11行目を
FXM = XM^3-7*XM^2+14*XM-6

にすればいいのでは?
952デフォルトの名無しさん:2009/05/22(金) 07:52:56
>>945,946
遅くなりましたがMATLABでも動作確認できました。
丁寧なアドバイスありがとうございます。
953デフォルトの名無しさん:2009/05/23(土) 00:11:03
俺はmaximaに移行した
954デフォルトの名無しさん:2009/05/28(木) 19:26:05
質問です。
データにフィルターをかけるとデータの最初の方が0に近い値になってしまうのですが、回避する方法はあるのでしょうか?
それとも、フィルターをかけた上で最初の方を切り取った方がいいのでしょうか。

使っているフィルターは3次のバターワースフィルタです。

955デフォルトの名無しさん:2009/05/28(木) 19:28:19
すみません、sageわすれましたorz
956デフォルトの名無しさん:2009/05/29(金) 23:22:21
位相遅れを無くしたいならfiltfiltを使えばいい

>最初の方が0に近い値になってしまう
これが何か問題になるの?
957デフォルトの名無しさん:2009/06/01(月) 01:44:36
2次のルンゲクッタ法のホイン法と中点法でプログラムを作っています。
xx = [];
i=0;
for t=0:dt:tf
i=i+1;
xx(:,i)=x;
xt = x;
for j=1:2
f = A*x + B*u;
d(:,j) = f*dt;
x = xt + d(:,j)*0.5;
end
x = xt + (d(:,1) + d(:,2))/2;
end
t=0:dt:tf;

どこか違うとこありますか?あったら教えてください。
958デフォルトの名無しさん:2009/06/01(月) 02:07:00
2次のルンゲクッタ法のホイン法と中点法でプログラムを作っています。
ホイン法
xx = [];
i=0;
for t=0:dt:tf
i=i+1;
xx(:,i)=x;
xt = x;
for j=1:2
f = A*x + B*u;
d(:,j) = f*dt;
x = xt + d(:,j);
end
x = xt + d(:,2);
end
t=0:dt:tf;
中点法
どこか違うとこありますか?あったら教えてください。
959デフォルトの名無しさん:2009/06/01(月) 02:09:28
2次のルンゲクッタ法のホイン法と中点法でプログラムを作っています。
中点法
xx = [];
i=0;
for t=0:dt:tf
i=i+1;
xx(:,i)=x;
xt = x;
for j=1:2
f = A*x + B*u;
d(:,j) = f*dt;
x = xt + d(:,j)*0.5;
end
x = xt + d(:,2);
end
t=0:dt:tf;

どこか違うとこありますか?あったら教えてください。
960デフォルトの名無しさん:2009/06/02(火) 22:18:09
2次のルンゲクッタ法のホイン法と中点法でプログラムを作っています。
中点法
xx = [];
i=0;
for t=0:dt:tf
i=i+1;
xx(:,i)=x;
xt = x;
for j=1:2
f = A*x + B*u;
d(:,j) = f*dt;
x = xt + d(:,j)*0.5;
end
x = xt + d(:,2);
end
t=0:dt:tf;

どこか違うとこありますか?あったら教えてください。
961デフォルトの名無しさん:2009/06/02(火) 23:30:21
なんだこの馬鹿は
962デフォルトの名無しさん:2009/06/07(日) 22:09:25
Student Editionてamazon.co.jpでも買える?
963デフォルトの名無しさん:2009/06/08(月) 13:35:18
matlabにはfortrunでいうgoto文のようなものはありますでしょうか?
○○行から××行の間の処理を繰り返したいのですが、
結構な行数なので見辛くなってしまいまして。。
ご存知の方がいましたら教えて頂けると幸いです。
964デフォルトの名無しさん:2009/06/08(月) 18:30:23
結論:無し
ついでに書くならmatlabはループが苦手
965デフォルトの名無しさん:2009/06/08(月) 19:52:04
>>964
やっぱりないですよね。。
ご回答有難うございました。
966デフォルトの名無しさん:2009/06/11(木) 23:53:51
uicotrol関数のプッシュボタンやトグルボタンを
他の形(丸や多角形)にできますかね?
プロパティをみるとpositionによる縦横長さを
弄る以外にはなさそうですが、何か手段はありますでしょうか?
967デフォルトの名無しさん:2009/06/13(土) 03:17:22
デジタル信号の加速度時系列波形を
2階積分して変位の時系列波形を求めたいのですが、
どのように組めばいいのかがわかりません。
サンプルプログラムが載っていると
順を追えて理解がしやすいのですが、
何か参考となる本や文献があれば教えて頂きたいです。
968デフォルトの名無しさん:2009/06/20(土) 15:31:18
FFTの勉強中でプログラムを実際に作ってみたんですが
データ数8までは成功するのにどうしてか16以上になるとできません。
XXには既に並び替えたデータが入っています。
処理された結果がYです。

phase=log2(N);
for m=1:phase
W=exp(-i*2*pi/(2^m));
for n=1:N/2^m
for k=1:2^(m-1)
K=k+2^m*(n-1);
Y(K)=XX(K)+W^(k-1)*XX(K+2^(m-1));
Y(K+2^(m-1))=XX(K)-W^(k-1)*XX(K+2^(m-1));
end
end
XX=Y;
end
969デフォルトの名無しさん:2009/06/28(日) 20:18:52
質問させてください。
matlabでImageJと同等のリニアスケールのトゥルーカラー画像を表示させたいのですが、うまくいきません。
matlabでは明度がはっきりしない画像となってしまいます。

何か良い方法があれば教えてください。
970デフォルトの名無しさん:2009/07/05(日) 07:03:38
Matlabで大きな画像(1000x4000)をimagescで表示させ、saveasで保存すると、
元の画像よりも小さくなってしまいます。。

元のピクセルサイズを壊さずに保存できる方法を、
もしご存知の方がいたら教えてくださいm(_ _)m
971デフォルトの名無しさん:2009/07/05(日) 10:36:28
自己解決しました;;

imwrite(X, 'test.png');
のようにして解決しました。
972デフォルトの名無しさん:2009/07/06(月) 21:01:14
拘束条件(壁)があるときの2自由度ロボットアームのシミュレーションをしたいのですが、
拘束条件をどのように設定したらいいのか分かりません;

漠然とした質問で申し訳ないのですが、教えていただけたら幸いです。
973デフォルトの名無しさん:2009/07/07(火) 02:35:37
エスパーするとode+eventでなんとかなりそう
974デフォルトの名無しさん:2009/07/07(火) 17:15:29
画像をR成分、G成分、B成分と段階的に表示するプログラムを作りたいです。

A=imread('画像のアドレス');
B=zeros(size(A,1),size(A,2),3);

for(a=1:1:3)
for(i=1:1:size(A,1))
for(j=1:1:size(A,2))
B(i,j,a)=A(i,j,a);
B(i,j,a)=B(i,j,a)/255;
end
end
imshow(B)
end

このプログラムだとimshowが三回実行されますが、
実行間隔が短いので最後の1回の結果しか確認できません。
それぞれの間に10秒ずつ時間を置きたい場合などはどうしたらよいですか?
975デフォルトの名無しさん:2009/07/09(木) 19:46:10
自己解決しました。

pause(n)
でn秒プログラムの実行を停止できました。
976デフォルトの名無しさん:2009/07/24(金) 04:47:15
画像を読み込み、読み込んだ画像情報をファイルとして書き出す際に、
連番をファイル名に付け様と思ったのですが、上手くいきません。

write = imread('lex.jpg');
for i = 1 : 10
imwrite(write, ['file_' i '.jpg'], 'JPEG');
end

使用したのは上記のプログラムですが、imwriteのところでjpegを書き出すためのファイルが開けない、
というエラーがでます。
これを改善するにはどうすればいいのでしょうか。
よろしければ誰かご教授のほどをお願いいたします。
977デフォルトの名無しさん:2009/07/24(金) 13:09:36
int2str
978デフォルトの名無しさん:2009/07/24(金) 13:10:50
int2str
979デフォルトの名無しさん:2009/07/29(水) 12:48:54
質問です。
 A = diag([1,1,1,0,0,0]);
 eigs(A, 2, 'SM')
とすると
警告: Matrix is close to singular or badly scaled.
Results may be inaccurate. RCOND = 0.000000e+000.
が出て、結果が NaN, NaN となります。

どう対処すればよいでしょうか?
なお、実際に使いたい対象はもっとでかい素行列で、
full したくない、という事情があります。
980デフォルトの名無しさん:2009/07/31(金) 12:25:08
singularでない行列を放り込むしかないんじゃね?
981デフォルトの名無しさん
>>980
実際、今は入力の行列に小さな摂動を加えて
singularではないようにして回避していますが、
どうにも筋が悪いように思い、質問した次第です。