• 締切済み

matlabでのコロン演算子を用いた処理

matlabを用いて音声処理のプログラミングを行っています handles.y(handles.sS : handles.sE) = 0; %指定区間を無音に置き換え handles.sS = 1;%無音部の開始位置1 handles.sE = (handles.sT * handles.Fs);%無音部の終了位置を計算 handles.sT = 0; %無音部の初期値0 handles.Fs = 44100; %サンプリング周波数44100Hz 上のような処理で正弦波handles.yの指定区間を無音に置換し handles.sT = handles.sT - (1/handles.f * 1/72); %無音部の値を5°分減少 上のような処理で無音時間の長さを操作しています しかし再生を行うと コロン演算子をインデックスとして使う場合、整数オペランドが必要です という警告が出てきてしまいます。コロン演算子のオペランドを整数にしたいのですが、うまい処理が思いつきません。 なにか方法があればご教授お願いします。

みんなの回答

  • wek00
  • ベストアンサー率62% (90/145)
回答No.1

> うまい処理 安直にすぐ上かすぐ下の整数で代用(切り上げ・切捨て・四捨五入)すると うまくないということですか?差し支えなければその理由についても教えてください。

関連するQ&A

  • 量子力学における演算子と変数

    量子力学におえける演算子とは何かよくわからなくて困っています プログラミングをやっているのでプログラミングの話をしますが、プログラミングにおいて演算子とは、感覚的に言えばある変数を引数にして処理をするための関数的なもの + - x / の四則演算子が基本 sin() exp()などが演算子と言われても理解できるのですが 量子力学では、位置を表すxやyなども演算子として扱うと言われ プログラミング的にはそれらは関数のオペランドであり変数なので混乱しています 誰か上手く説明できる方がいらっしゃったら教えて下さい Ψを使った演算子の交換についての項で詰まっています

  • 問題がとけません

    以下の問題がわかりません。 教えていただけますでしょうか? 以下の仕様を満たすプログラムを作成せよ。 キーボードから2整数を読み込み,読み込んだ順に標準出力にそれらの値の10進数表現をスペース文字で区切って1行に書き出し,改行する。読み込んだ一番目の整数の値が1000でなければ,次の2整数を読み込み同様に書き出す。一番目の整数の値が1000のときプログラムの実行を終了する。 ヒント------------------------------------------------- stdio.hをインクルードする。 読み込んだ値を保持するための2つの整変数を宣言して定義する。 2つの整数を読み込んで,その値を書き出すことを繰り返す部分は,次のdo-whileループで実現する。 do { (1) //2整数の読み込み //2整数の書き出し } while(条件); (2) プログラムの実行は上から順に行われるが,(2)で条件が真であれば(1)に戻り,そこから再び下方に順番に実行される。条件が真でなければ,(2)の次の行から下に順番に実行される。したがって,(2)の条件が満たされているかぎり,(1)と(2)の間を繰り返し実行することになる。このdo-whileループは,必ず1回は実行される点で,whileループと異なる。 行中に//があると,そこから行末まではコメントとみなされ書かれている内容は無視される。また,任意の位置に書かれた,一対の/*と*/の間もコメントとみなされる。 この課題の繰り返しの条件は,読み込んだ一番目の整数が1000でないこと。 iを整変数として, i != 1 という論理式の値は,iが1のとき偽,iが1でないとき真である。 2種類ある等値演算子の1つであるこの"!="という2項演算子(演算子の両側に1項ずつの2項を使う演算子)による演算結果は,両側の2つのオペランド(演算子が働きかけるもの)の値が「等しくない」とき真,それ以外のとき偽である。もう一つの等値演算子は"=="で,演算結果は2項が「等しい」とき真,それ以外のとき偽となる。 

  • VBA 時間の抜き出しが上手く処理できない

    時間の抜き出しをするのに下記のコードを候補に挙げましたが、 「'コロンが2個の場合 (時:分:秒)」の場合は上手く処理できますが 「'コロンが1個の場合 (分:秒)」の数値が上手く処理できません。 ’----------------------------------------------------------------------- Option Explicit Sub コロンの数を数える() Dim i As Long, cnt As Long, n As Variant For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row cnt = 0 '←cntをリセット Do n = InStr(n + 1, Cells(i, "A"), ":") If n = 0 Then Exit Do Else cnt = cnt + 1 End If Loop If cnt < 1 Then MsgBox "[:]がありません。" '←cntが1未満のときにメッセージを発出します。 End Else Cells(i, "B").Value = cnt End If Next End Sub Sub 時間抜き出し() Dim i As Long, cnt As Long Dim n As Single For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row n = InStr(n + 1, Cells(i, "A"), ":") 'コロン「:」の位置を特定する If Cells(i, "B") = 1 Then 'コロンが1個の場合 (分:秒) Cells(i, "C").NumberFormatLocal = "h:mm:ss" If Mid(Cells(i, "A"), n - 2, 1) = " " Or Mid(Cells(i, "A"), n - 2, 1) = "(" Then '10分以下の場合 Cells(i, "C") = Mid(Cells(i, "A"), n - 1, 4) Cells(i, "C") = "0:" & Cells(i, "C") Else '10分以上 Cells(i, "C") = Mid(Cells(i, "A"), n - 2, 5) Cells(i, "C") = "0:" & Cells(i, "C") End If Else 'コロンが2個の場合 (時:分:秒) Cells(i, "C").NumberFormatLocal = "h:mm:ss" Cells(i, "c") = Mid(Cells(i, "A"), n - 1, 7) End If n = 0 Next End Sub

  • 不正な処理を・・

    win98SE,OE6を使っています。 昨日よりメールに返信を書いていると突然に 「不正な処理をしたので・・」と終了してしまいます。 そうならないよう細切れでメールを送る始末です。 詳細をみると 「MSIMN のページ違反です。 モジュール : MSHTML.DLL、アドレス : 0187:636bd8b8 Registers: EAX=004f6234 CS=0187 EIP=636bd8b8 EFLGS=00010202 EBX=0260058c SS=018f ESP=0056f3bc EBP=0056f3dc ECX=00000118 DS=018f ESI=00000008 FS=4c0f EDX=0040002c ES=018f EDI=004f6234 GS=0000 Bytes at CS:EIP: f3 a5 8b 4d 08 8b 49 0c 89 41 08 e9 76 13 fc ff Stack dump:」 とあります。 昨日WInのアップデートしたことくらいしか心当たりがありませんがこれはなんなのでしょうか? IEは全く快調です。これ以外にPCの不調はありません。 OE6にしたのは一年くらい前からです。 よろしくお願いいたします。

  • log2の「正確な」計算方法

    perlでlog2を計算するにはどのようにしたらよいのでしょうか。 perldocによると sub log2 { my $n =shift; return log($n)/log(2); } でよいはずですが、log2 が「正しく整数を返すかどうか」は保証されていないので、時として問題があるようです。 通常、log2 の結果 $a を単に print $a などとして出力する分には Perl が適当? に判断して丸め処理をしてる傾向があるようですが、これを printf "%d", $a とすると、本当に整数部だけが出力され、演算精度によっては意図 しない数値になる場合があるとのこと、計算機環境にインストール した Perlで、演算精度を上げるオプションを追加した場合などで、実際に出力結果が異なる、との報告を受けました。 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • gotoを使わずに2

    やっぱり全体がないとわかりませんよね・・・ とりあえず、コピーします。見にくいとおもいますが・・ 中置法を逆ポーランドに変換するプログラムです。 void CPorandoView::OnButton1() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください CString ss; char st[30],z[30],tai,ap; CEdit* myED1=(CEdit*)GetDlgItem(IDC_EDIT1); //EDIT1のアドレスをmyED1の代入 CEdit* myED2=(CEdit*)GetDlgItem(IDC_EDIT2); //EDIT2のアドレスをmyED2の代入 CEdit* myED3=(CEdit*)GetDlgItem(IDC_EDIT3); //EDIT3のアドレスをmyED3の代入 myED1->GetWindowText(ss); //入力された中置法式を作業領域ssに代入 int np=0,stp=0,zp=0,a=999,i=0,sw=0; char ka[30],s=0,kp=0; float st2[30]; float x=0; char p[100]="" ; char *N = new char[ss.GetLength()+1]; //ダイアログ(中置法入力枠)に入力された式をNに入れ込む strcpy( N, ss ); myED1->SetWindowText(""); myED2->SetWindowText(""); myED3->SetWindowText(""); if(N[0]==NULL){ int ret; ret=AfxMessageBox("入力がありません。",MB_OK|MB_ICONEXCLAMATION); goto end; } if(30<strlen(N)){ int ret; ret=AfxMessageBox("入力文字数オーバーです。",MB_OK|MB_ICONEXCLAMATION); goto end; } for(;a!='\0';np++){ a=N[np]; tai=0; if( a>0x003a){ if(a<0x007e ){ if(a!='*' && a!='/' && a!='+' && a!='-' && a!='(' && a!=')'){ int ret; ret=AfxMessageBox("指定外文字が入力されています。",MB_OK|MB_ICONEXCLAMATION); goto end; } } } if(a==0x0030){ int ret;      ret=AfxMessageBox("0は入力不可です。",MB_OK|MB_ICONEXCLAMATION);//入力が0の場合エラーを表示 goto end; } if(a>'0' && a<='9'){      if(z[zp-1]>='0' && z[zp-1]<='10'){      z[zp]=','; zp++; } z[zp]=a;      zp++; z[zp]='\0';      sw--; }else if(a!='(' && a!=')'){ if(stp==0){ st[stp]=a; stp++; st[stp]='\0'; sw++; }else if(st[stp-1]!='('){ if(st[stp-1]=='*' || st[stp-1]=='/'){ tai=2; }else{ tai=1; } }else{ st[stp]=a; stp++; } if(a=='*' || a=='/'){ ap=2;      sw++; }else{ ap=1; sw++; } if(sw>1){ int ret; ret=AfxMessageBox("演算子が連続しているか、\n先頭、または最後尾に演算子が入力されています。",MB_OK|MB_ICONEXCLAMATION); goto end; } if(tai!=0){ if(ap<=tai){ z[zp]=st[stp-1];                st[stp-1]=a; zp++; z[zp]='\0'; st[stp]='\0'; if(a==st[stp-2]){          z[zp]=st[stp-2]; zp++;          st[stp-2]=st[stp-1]; z[zp]='\0'; st[stp-1]='\0'; stp--; } }else{ st[stp]=a; stp++; st[stp]='\0'; } } }else if(a=='('){ st[stp]='('; stp++; st[stp]='\0'; }else { while(st[stp]!='('){、 stp--; if(st[stp]!='('){ z[zp]=st[stp]; zp++; } } } } if(stp>=0){ stp--; while(stp>=1){ z[zp]=st[stp-1]; zp++; z[zp]='\0'; stp--; } } if(sw<=0){ int ret; ret=AfxMessageBox("数値は1~9までです。",MB_OK|MB_ICONEXCLAMATION);//演算子がないとエラー処理 goto end; } z[zp+1]='\0'; myED2->SetWindowText(z); end: ; }

  • ダブルコロンとアロー演算子

    ダブルコロンとアロー演算子は共に関数の呼び出しと認識しているのですが、具体的にどこが違うのでしょうか? 初心者質問で恐縮ですが、宜しくお願いします。

  • 至急!助けて下さい。プログラミングJava

    明日までの大学の課題が、わかりません。 どなたか教えてください。書き方が、わかりません。言語はJavaです。 よろしくお願い申し上げます。 1.条件分岐 整数d,xをキーボードから入力させ、 dとzの差の大きさ(絶対値)を計算し、結果を表示するプログラムを作りなさい。 2.繰り返し 整数qcをキーボードから入力させ、1からqcまでの整数を全て表示させるプログラムを作りなさい 3.式 式y=xの二乗+6x+10の値を、x=13から21まで、一つづつ変化させた時のyの値を表示しなさい。 4.和 1から58までの和1+2+3+….+58をプログラムを作って求めなさい。 5.乱数 乱数関数rnd()を使って、変数wgに0~383までの適当な数値を代入し、その結果を出力しなさい。 6.円を描く for文を使って、適当な位置に半径17の赤い円を、87個だけ描きなさい。 7.余り 変数qeに整数を入力させ、その変数qeが6で割り切れたら「割り切れる」と表示し、それ以外は「割り切れない」と表示するプログラムを作りなさい。 *ヒント %演算子で割った余りが求められる。 例えば、5%3は2となる。 8.break文 変数bjに0から1000までの乱数を作っては代入することを繰り返し、bjの値が900以上になったら繰り返しを止めて、bjの値を出力するプログラムを作りなさい。 9.カウント 1から1076までの整数の中で、8で割り切れる数がいくつあるかカウントしてその数を表示しなさい。 以上です。 どうかお助け下さいm(__)m

  • 論理演算を用いての演算処理について

    論理演算を用いての剰余を行うプログラムを教えてください。

  • 秋季の情報処理試験、何を受けたらいいでしょうか

    文系学部出身の、若手SEです。 春季の情報処理試験で、応用情報にやっと受かりました。 これから2年間、高度情報処理試験の午前試験が一部免除になるので、 早めに対策をして、合格をしたいと思っています。 実務はかなり特殊なことをしており、COBOLで金融システムを構築しています。 COBOLということもあり、転職は、考えておりません。 (前提) ・私の会社では、情報処理技術者試験を一番重く見ています。 高度情報に一つは受かっていないと、主任級になれない決まりがあります。 ・私の職場では、DBは一切触りません。DB専門のチームの方がすべて作られ、それを簡単なツールで触る程度です。 ・COBOLということもあり、情報処理試験以外に取れそうな資格がありません。 ・去年、簿記2級を取得しました。 ・応用情報では、ストラテジ、マネジメント系を選択しました。どちらも点数に偏りはありませんでした。 秋の試験は 1.ITストラテジスト試験 (ST) 2.システムアーキテクト試験 (SA) 3.ネットワークスペシャリスト試験 (NW) 4.情報セキュリティスペシャリスト試験 (SC) 5.ITサービスマネージャ試験 (SM) ですが、実務経験的にも、1は絶対に太刀打ちできないと思います。 2,5も難易度が高く、論文もあるのでちょっとしんどいかもしれません。 となると、残るはネットワークかセキュリティなのですが、どちらも自分のスキルに全くひもづかない気がして・・・。 何を受けようか、真剣に悩んでいます。もう、次の試験まで2か月しかないし、早く参考書を買って勉強したいのですが・・・ 「試験を受けるのではなく、新聞を読んだりしたほうがいいよ」といった感じのご意見も、もっともだと思います。自分も本当は、もっと汎用的な知識を身に付けたいのですが、会社の方針にある程度従うことも、大切かと思っています。 よろしければ、一緒に次の試験、何を受けるか相談に乗ってもらえないでしょうか。 よろしくお願いいたします。

専門家に質問してみよう