人に聞けない痔の悩み、これでスッキリ >>

MATLABでの行列の全要素の和を計算するのに下の例のようにfor文を使うのとsum関数を使うのとで結果が違います。何故ですか?
計算結果の差をとってみると極々微小な差が生じてしまいます(e-10位)。
シミュレーションの中でこのような処理を行っているのでより正確な方が知りたいです。


A=rand(10);
plus=0;
sum=0;
for i=1:10
 for j=1:10
  plus=plus+A(i,j);
 end
end

sum=sum(A(:));

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

A 回答 (1件)

コンピュータの浮動小数点演算は、計算順番が違うだけで差が出るものです。


http://ja.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95% …


MATLABのsumがどんな実装しているのかは、知りません。
ですが、このforで集計している部分は、まったく無策なのは明らかです。

今回のAは、全て正の値なので、小さい値から順番に足していくと、誤差が小さくなります。
なので、単純な足し算、ソートしての足し算、sumの3つを比べてどうなっているか、である程度の判断はできます。


ですが、正負が混じったりすると、単純ではありません。

これ以上の精度が必要なら、多倍長精度と呼ばれるようなものを使う必要があります。
MATLAB標準には無いので、外部ツールに頼ることになります。
    • good
    • 0
この回答へのお礼

ソートして足し算してみた結果と比べるとどっちも同じくらいの精度だけど微小な差が生じることがわかりました。
ありがとうございました。

お礼日時:2014/07/28 15:16

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

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

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

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

Qmatlabで条件をみたしたデータの総数を数えることは可能ですか?

matlabで条件をみたしたデータの総数を数えることは可能ですか?

例として2×5の以下の行列

1 3 0 2 0
1 0 1 2 1

の一行目で0以上の値を持ったデータの総数を知りたいとき(答えは3)

初心者なのでわからないことだらけで困っています。

よろしくお願いします。

.

Aベストアンサー

三度Kulesです。
なるほど、そういうことでしたらANo.2さんの書かれたsumを使う方法がよいでしょう。
sumは合計を出す次元を指定することができますので、
sum(A>0,2)とすれば行ごとの要素数が出ます。
ちなみに列ごとの要素数を出したければ
sum(A>0,1)とすればよいです。

繰り返し、と書かれていますが、Matlabの場合各関数の使い方をよくみてみると
forループなどのループ構文を使わなくても書ける場合が多いです。

以上、参考になれば幸いです。

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の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 で 連番処理をしたい

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で行列を配列に格納する方法

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で小数の値を小数点以下切捨てなどで整数にする方法はありますか?

Aベストアンサー

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

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

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のグラフで軸目盛りのフォントサイズを大きくする方法?

MATLABのplotグラフで、
xlabel、ylabel、titleなどは、
FontSizeプロパティの指定により、
サイズを簡単に変更できるのですが、

軸の目盛りのフォントサイズを変更する方法が分からず
困っています。どなたか、キーワード、参考URLなど
ご教示頂ければありがたいです。よろしくお願いします。

Aベストアンサー

set(gca,’FontSize’,14);
とかすれば、よいのでは。
いま、matlabを使える環境にないので、もしかしたら間違っているかもしれませんが。

get(gcf)
とか、すれば、図のプロパティ一覧が得られます。
get(gca)
とかやると、軸のプロパティ一覧が得られます。
それっぽいやつを、set()で変更すればよいです。

QMATLABでssを実行すると、未定義な関数としてエラーになる。

MATLABでssを実行すると、ssが未定義な関数として認識されて
エラーになっているようです。

どなたか、対処方法をご存じでしょうか?
宜しくお願いいたします。

■実行環境
OS:WindowsXP SP2
MATLAB:2007a

■実行したM-ファイル
%test
l=0.2404;
M=0.390;
J=0.0712;
c=0.695;
g=9.81;

A=[0 1; -M*l*g/J -c/J];
B=[0; 1/J];
C=[1 0];
D=0;

sys = ss(A,B,C,D);

■実行結果
??? 未定義の関数、またはメソッド 'ss' (タイプ'double' の入力引数)。

エラー ==> test at 13
sys = ss(A,B,C,D);

■調べた事項
>> ver
-------------------------------------------------------------------------------------
MATLAB Version 7.4.0.287 (R2007a)
MATLAB License Number: XXXXXX
Operating System: Microsoft Windows XP Version 5.1 (Build 2600: Service Pack 2) Java VM Version: Java 1.5.0_07 with Sun Microsystems Inc. Java HotSpot(TM) Client VM mixed mode
-------------------------------------------------------------------------------------
MATLAB Version 7.4 (R2007a)
Simulink Version 6.6.1 (R2007a+)
Communications Blockset Version 3.5 (R2007a)
Communications Toolbox Version 3.5 (R2007a)
Filter Design HDL Coder Version 2.0 (R2007a)
Filter Design Toolbox Version 4.1 (R2007a)
Fixed-Point Toolbox Version 2.0 (R2007a)
Link for ModelSim Version 2.2 (R2007a)
Signal Processing Blockset Version 6.5 (R2007a)
Signal Processing Toolbox Version 6.7 (R2007a)
Simulink Fixed Point Version 5.4.1 (R2007a+)

Trademarks
------------------
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, and xPC TargetBox are registered trademarks and SimBiology, SimEvents, and SimHydraulics are trademarks of The MathWorks, Inc. Other product or brand names are trademarks or registered trademarks of their respective holders.
>> which ss -all
C:\Program Files\MATLAB\R2007a\toolbox\signal\signal\@dfilt\ss.m % dfilt method

>> matlabroot

ans =

C:\Program Files\MATLAB\R2007a

>> path

MATLABPATH

C:\Program Files\MATLAB\R2007a\toolbox\matlab\general
C:\Program Files\MATLAB\R2007a\toolbox\matlab\ops
(中略)
C:\Program Files\MATLAB\R2007a\toolbox\signal\signal
(後略)
>>

MATLABでssを実行すると、ssが未定義な関数として認識されて
エラーになっているようです。

どなたか、対処方法をご存じでしょうか?
宜しくお願いいたします。

■実行環境
OS:WindowsXP SP2
MATLAB:2007a

■実行したM-ファイル
%test
l=0.2404;
M=0.390;
J=0.0712;
c=0.695;
g=9.81;

A=[0 1; -M*l*g/J -c/J];
B=[0; 1/J];
C=[1 0];
D=0;

sys = ss(A,B,C,D);

■実行結果
??? 未定義の関数、またはメソッド 'ss' (タイプ'double' の入力引数)。

エラー ==> test at 13
sys = ss...続きを読む

Aベストアンサー

単純に該当するss関数がないだけでしょう。

> sys = ss(A,B,C,D);
この使い方をするss関数は、別のToolboxの関数じゃないですか?

■ Control System Toolbox
ftp://ftp.eng.auburn.edu/pub/bhidetm/t/jhelp/toolbox/control/ss.html


人気Q&Aランキング

おすすめ情報