• ベストアンサー

MATLABからCへ

if(n>1), nrm = sqrt(sum([A.*conj(A)],2)); else nrm = abs(A); end return MATLABで次のように与えられたときどのようにしてC言語で書けばよいでしょうか??

質問者が選んだベストアンサー

  • ベストアンサー
  • teapots08
  • ベストアンサー率52% (32/61)
回答No.1

行列Aのサイズや具体的な値が書いてあると、回答しやすいと思います。 n=1の場合は 行列Aの各行に対して、(複素数の絶対値の二乗)の総和を計算したもの n=1以外の場合は 行列Aの各値の複素数の絶対値 だと思います。

gta0208
質問者

補足

すいません[m,n]=size(A); っとなってます><。。

関連するQ&A

  • Cのソースコードについて

    #include<stdio.h> int main(void) { long a[6000],sum[6000],max=0; int i,j=0,n,m; for (m = 0; m <= 6000; m++) sum[m] = 0; for (i = 0;; i++) { scanf_s("%ld", &a[i]); if (a[i] > 0) sum[j] += a[i]; else if (a[i] < 0) { j++; sum[j] = -1; j++; } else break; } for (n = 0; sum[n] == 0; n++) { if (max < sum[n]) max = sum[n]; } printf("%ld",max); while(1){} return 0; } こんなコードを書いたのですが 答えが常に0になってしまいます。 原因がはっきりしないので教えてください 使用言語はCです

  • MATLABとC++

    こんにちわ。資料を参考にしつつMATLABからC言語へ変換する作業をしているのですが、どちらに関しても初心者レベルで遅々としてはかどりません…。 分からないことの一つとして、MATLABは行列計算がしやすいがC言語はそうではないということからなのですが、MATLABで A = zeros(10,20,30) というのは次元10×20×30をもつゼロ行列 ということは分かったのですが、これは 数学で習う行列、2×2 や3×3など二次元な数字の並びを、三次元にまで拡張した表し方ということでしょうか?? また、上の式をC言語で書き表すとすると どのように書き表せるのでしょうか?どなたか分かるかた 教えていただければと思います。

  • Matlabについて質問です

    Matlabについて質問です。 長さがdataの数のデータがあり次のように分類したいのですが、データの中の-0.0074などが1になってくれません。 どこに原因があると思われますか?よろしくお願いします! recd=zeros(length(data),1); for n=1:length(data) if data(n)<-0.01; recd(n) = 0; elseif(-0.01<=data(n)<0); recd(n) = 1; elseif(0<=data(n)<0.01); recd(n) = 2; else recd(n) = 3; end end よろしくお願いします!!

  • MATLABの計算過程での質問です。

    はじめまして。 MATLABのコードでどうしてもわからないことがあり質問させていただきます。 問題はerrorの計算で起こります。 error=Σ[((F_n+1)-(F_n))/(F_n+1)] ループ内の計算がiter=1以降に進まなくなりました。 いろいろ編集してみましたが、どうしてもerrorのところがうまく働きません。 良かったらアドバイスよろしくお願いします。 tol=tolerance N=number of maximum iterationです ---------------------------------------------------------------- tol=0.01; N=100; A=zeros(26,26); f0=zeros(26,26); A(11:26,1)=100; A(26,1:16)=100; f=A; iter=1;f0=0 n=1; for n=1:N for i=2:26-1 for j=2:26-1 f(i,j)=(1/4)*(A(i+1,j)+A(i-1,j)+A(i,j+1)+A(i,j-1)) error(i,j)= sum(abs((f(i,j)-f0(i,j))./f(i,j))); end end if error <=tol break; else A=f; f0=f; iter=iter+1 end end

  • 再起になってますか?[C++]

    再起を使って総和のプログラムをつくったのですが、ちゃんと再起に なってるのか自信がないので教えてください。 これはほんの一部のコードなんですが computeRecursiveSum()の中のreturn( computeSum() ); の部分があってるのかわかりません。 本やそこらのサイトをみてみるとこの部分は、 return(n+Sum(n-1)); という風になっているのですが 下のような書き方してもよろしいのでしょうか? 一応、正しい答えはでます。 int Summation::computeSum() const{   int a=0;   for (int i=0; i<=number; i++){     a = i*(i+1)/2;   }   return a; } int Summation::computeRecursiveSum() const {   int n = number;   if ( n < 0 )     return (-1);   else if ( n = 0 )     return (0);   else     return( computeSum() ); }

  • MATLABの計算精度

    いま,  A=[0.803, -0.803, 1.2124, 0.803, -0.803, -0.803, 1.2124, 0.803]; とします. このとき,次の2通りの演算をします. (i) a=0; for I=1:8  if( A(I)>=0 )   a=a+A(I)*0.25;  else   a=a+A(I)*0.75;  end end (ii) Bi=[0.25, 0.75, 0.25, 0.25, 0.75, 0.75, 0.25, 0.25]; b=sum(Bi.*A); (i)と(ii)によって得られる和の値をMATLABのコマンド上で表示すると, 同じ値として表示されるのですが,a-b と計算すると,0 ではなく, 8.04e-15のようになります.(現環境ではMATLABが使えないので,確認できませんが,もっと大きいデータでやったとき場合には,上記のように誤差が生じました). 困っているのは,現在組んでいるプログラムでは計算した値の正負によって 異なった計算をする必要があり,計算精度が非常に重要になってきます. そのため計算結果が例えば +1.4e-15となるか -6.4e-16 となるかによってその後の計算結果が大きく変わってしまいます. MATLABでは,上記(i)(ii)のような誤差が生じるためか,+1.4e-15となってほしいところが,なぜか -6.4e-16となってしまいうまくプログラムが動きません. MATLABでは,for文によって和をとるのではなく,一回でまとめて計算しなければ誤差が生じるのでしょうか? また,MATLABで計算精度を変更できないのでしょうか? (formatコマンドによって,「format short g」「format double g」としましたが有効な小数点が増減するだけで結果は同じでした.) よりよい精度で計算するにはどうしたらよいのでしょうか? 回答よろしくお願いします.

  • C言語への翻訳お願いします

    以下の文はある本から抜粋してきたガウス・ジョルダン法のサブルーチンです。Cに翻訳してくださいって言ったら怒りますか?(笑 c Gauss-Jordan method subroutine gj(a,n1,nn,m,epsl,isw) double precision a,epsl,p,w dimension a(n1,*) nplsm=nn+m do 100 n=1,nn p=0.0 do 10 i=n,nn if(p.lt.abs(a(i,n))) then p=abs(a(i,n)) ip=i end if 10 continue if(p.le.epsl) then isw=1 write(6,*) 'error' return end if do 20 j=n,nplsm w=a(n,j) a(n,j)=a(ip,j) 20 a(ip,j)=w do 30 j=n+1,nplsm 30 a(n,j)=a(n,j)/a(n,n) do 40 i=1,nn if(i.ne.n) then do 45 j=n+1,nplsm 45 a(i,j)=a(i,j)-a(i,n)*a(n,j) end if 40 continue 100 continue isw=0 return end だいたい自分でもCに書き換えることはできたんですが、次のところがどのように書き換えたらよいのか分かりません。 subroutine gj(a,n1,nn,m,epsl,isw), dimension a(n1,*), do 20 j=n,nplsm w=a(n,j) a(n,j)=a(ip,j) 20 a(ip,j)=w どうかよろしくお願いします。

  • 関数におけるif文とreturn文について

    ◎1-------------------------------------------- #include<stdio.h> #include<math.h> double maxdt(double a,double b); void disp_sqrt(double n); int main(void) { double mx; mx=maxdt(22.33,44.55); printf("mx=%f\n",mx); disp_sqrt(3.0); disp_sqrt(-6.0); return 0; } double maxdt(double a,double b) { if(a>b) return a; else return b; } void disp_sqrt(double n) { if(n<=0.0) return; printf("%f の平方根=%f\n",n,sqrt(n)); } ----------------------------------------------- ◎2------------------------------------------- #include<stdio.h> #include<math.h> double maxdt(double a,double b); void disp_sqrt(double n); int main(void) { double mx; mx=maxdt(22.33,44.55); printf("mx=%f\n",mx); disp_sqrt(3.0); disp_sqrt(-6.0); return 0; } double maxdt(double a,double b) { if(a>b) return a; else return b; } void disp_sqrt(double n) { if(n<=0.0){ return; printf("%f の平方根=%f\n",n,sqrt(n)); } } ----------------------------------------------- ◎3-------------------------------------------- #include<stdio.h> #include<math.h> double maxdt(double a,double b); void disp_sqrt(double n); int main(void) { double mx; mx=maxdt(22.33,44.55); printf("mx=%f\n",mx); disp_sqrt(3.0); disp_sqrt(-6.0); return 0; } double maxdt(double a,double b) { if(a>b) return a; else return b; } void disp_sqrt(double n) { if(n<=0.0){ return; } else{ printf("%f の平方根=%f\n",n,sqrt(n)); } } -------------------------------------------------- ◎1は参考書を参考に作ったものです。 ◎1は正常に動きます。 以上3つのプログラムで、疑問に思ったのは、関数「void disp_sqrt(double n);」についてなのですが、自分はif文が文が1つでもカッコ{ }を付けたい考えなので、◎1の「void disp_sqrt(double n)」の関数のif文に{}を付けようと思い、まず◎2のように変えたところ、平方根の表示が何も出ませんでした。 return文も文の1つだと考え、◎3のような形は正常に動きました。 return文とprintf文の2つの文があるという考えは間違っているのでしょうか? 後、◎1は何故{ }が無くてもよく、◎2は何も表示されないのでしょうか? 教えていただけると嬉しいです。

  • MATLABのデータ抽出についておたずねしたいことがあります。

    MATLABのデータ抽出についておたずねしたいことがあります。 MATLAB初心者ですが、以下のようなプログラムを現在書いています。 f = input('file name? ---> ','s'); m = csvread(f,66,2,[66,2,1089,3]); time=(0:0.002:2.046); t=reshape(time,1024,1); current=m(:,1)*1000; voltage=m(:,2)*10; m2=[t current voltage]; a=m2(1,2); b=m2(2:40,2); if a>max(b); g=a; end for I=2:1024; for J=1:1024; for K=39+I; if K>1024; K=1024; end c=m2(I,2); d=m2(J:I-1,2); e=m2(I+1:K,2); if c>max(e)&&c>max(d); g=c; else end end end end plotyy(t,current,t,voltage) ylim([0,700]) ifの条件を満たしたときに、m2の2列目の値だけでなく条件を満たしたその行の3列全てのデータを抽出し、条件を満たした行だけの新たな行列を作りたいのですが、どのような命令を書けばよいでしょうか。 お手数をおかけしますが、ご教授よろしくお願いいたします。

  • 解けません!

    http://www.pref.fukushima.jp/pc-concours/2008/03/pdf/2007honsen.pdf この問題03の宅配料金の問題が解けません!! 書かれている入力例と出力例はあっているのですが、 学校のジャッジシステムが受けつけてくれません。 どなたか僕のプログラムの不備を見つけて下さい。 お願いします。 #include <stdio.h> int ryoukin(int x, int y, int h, int w) { int i,t,c; i = x + y + h; if (i <= 60) t = 600; else if (i <= 80) t = 800; else if (i <= 100) t = 1000; else if (i <= 120) t = 1200; else if (i <= 140) t = 1400; else if (i <= 160) t = 1600; else t = 0; if (w <= 2) c = 600; else if (w <= 5) c = 800; else if (w <= 10) c = 1000; else if (w <= 15) c = 1200; else if (w <= 20) c = 1400; else if (w <= 25) c = 1600; else c = 0; if (t == 0) return 0; else if (c == 0) return 0; else if (t < c) return c; else return t; } int main(void) { int x,y,h,w,n,i,sum; sum = 0; while(n != 0){ scanf("%d",&n); if(n != 0){ for(i = 0; i < n; i++){ scanf("%d %d %d %d", &x, &y, &h, &w); sum = sum + ryoukin(x,y,h,w); } printf("%d\n",sum); sum = 0; } } return (0); }

専門家に質問してみよう