「NUMERICAL RECIPES in C」
(ニューメリカル レシピーズ イン シー)
と言う、本に載っている
特異値分解法と最小2乗法のプログラムを完成させたいのですが
誰か、教えていただけないでしょうか?
別に、それでなくても、特異値分解法と最小2乗法のC言語でのプログラム
の作り方を教えてください!
よろしく、お願いします!

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

A 回答 (1件)

この本をお持ちのようですがそれ以上何が知りたいのでしょう?


試してみるためのmainルーチンの書き方が分からないということでしょうか?

以下のURLに本に載っているルーチンのソース、及びテスト用のmainルーチンのソースがあります。

http://www.astro.uni.torun.pl/~vario/recipes/htm …

日本語の本よりバージョンが新しいようですので本とは少し違うかもしれません。
上記のURLの本文はPS形式のものしかありませんが、下記URLにはPDF形式のものがあります。

http://www.ulib.org/webRoot/Books/Numerical_Reci …

参考URL:http://www.astro.uni.torun.pl/~vario/recipes/htm …
    • good
    • 0

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

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

QNumerical Recipesのran2の乱数発生器のプラグラムを

Numerical Recipesのran2の乱数発生器のプラグラムを使用したく思います。
このran2はどこにソースがあるのでしょうか?
Numerical RecipesのHPに行ったら、有償とか書かれたのですが
有償でしか手に入いらないのでしょうか?
ご存じのかた、教えてください。

Aベストアンサー

「Numerical Recipes in C」の第2版なら下記で公開されています。(原語だけど)

http://www.nrbook.com/a/bookcpdf.php

ran2 は 「7 Random Numbers」の「7.1 Uniform Deviates 275」の282ページに掲載されています。(見るのにAdobe ReaderにPluginをインストールする必要があります)

これの日本語版の本にはソースは本から直接打ち込んで使用するのは良いけど、打ち込んだものを再配布したりするのはダメだとか書かれてたような気がしますが、このPDFで公開されてるのはどうなんでしょうねぇ。

Q現在、C/C++ で作成したプログラムを C# に移植しているのですが

現在、C/C++ で作成したプログラムを C# に移植しているのですが
基本的な部分が分からずに困っています。

C# のバイト配列に対し、C/C++ で言う memmove 関数を行う方法
が知りたいのです

C/C++ で下記のような事を
char a[] = {1,2,3,4,5};
char b[5];
memset( b,0x00,sizeof(b));
memmove( &b[2], &a[3],2);

C# のバイト配列でやる場合
byte[] a = { 1, 2, 3, 4, 5 };
byte[] b = new byte[5];
memmove( &b[2], &a[3], 2);
memmove の部分はどのようにして行うのでしょうか?

Aベストアンサー

Array.Copy( a, 2, b, 3, 2);

のような感じでできると思います。

Q小文字は大文字に、大文字は小文字に変換して表示するプログラム

C言語の問題で、ユーザが文字を入力し、CTRL+Zが押されるまで、半角英数字の入力を受け付ける。
受け付けた文字列(最大でも1000文字)を、小文字は大文字に、大文字は小文字に変換して表示するプログラムを作成する。数字に対しては何も変化させなくて良い。
けっこう考えたんですが全くわかりません。
どなたか知恵を貸してください。

Aベストアンサー

#include <stdio.h>
#include <ctype.h>

int main (void)
{
int c;

if((c = getchar()) == EOF) return 0;
if(isupper(c)) c = tolower(c);
else c = toupper(c);
putchar(c);
main();
return 0;
}

Q大文字を小文字に、小文字を大文字にするプログラム

問題は、
ファイルにあるアルファベットの大文字を小文字に変換し、小文字は大文字に変換して、ファイルに保存するプログラムを作りなさい
というものです。
色々考えて、
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <unistd.h>
#include <ctype.h>

int main(int argc,char **argv){
int fd,flag1,flag2;
int i,n;
char buffer[512],x;
fd = open(argv[1],O_RDWR);

if(fd == -1)
perror("open");

while((n = read(fd,buffer,sizeof(buffer)))>0){
x = buffer[i];
flag1 = islower(x);
flag2 = isupper(x);

for(i=0;i<n;++i)
if(flag1 == 1){
buffer[i] = toupper(buffer[i]);
}else if(flag2 == 1){
buffer[i] = tolower(buffer[i]);
}
write(fd,buffer,n);
}
close(fd);
exit(0);
}

のようなプログラムを考えましたが、うまくいきません。
toupperのような関数を使ったのは初めてなのでよく使い方が分からずこのようなプログラムになってしまいました。
どうか正しく動くようなプログラムを教えてください。お願いします。

問題は、
ファイルにあるアルファベットの大文字を小文字に変換し、小文字は大文字に変換して、ファイルに保存するプログラムを作りなさい
というものです。
色々考えて、
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <unistd.h>
#include <ctype.h>

int main(int argc,char **argv){
int fd,flag1,flag2;
int i,n;
char buffer[512],x;
fd = open(argv[1],O_RDWR);

if(fd == -1)
perror("open");

while((n = rea...続きを読む

Aベストアンサー

flag1 = islower(x);
flag2 = isupper(x);

if(flag1 == 1){
buffer[i] = toupper(buffer[i]);
}else if(flag2 == 1){
buffer[i] = tolower(buffer[i]);
}

flagって名前のフラグ変数もどうにかして欲しいけどそれはおいといて、
isupper/islower なんかの戻り値は0/1とは限りません。


Manpage of ISALPHA
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/isspace.3.html
文字 c が調べた文字の種類に合っていれば 0 以外を返す。そうでなければ 0 を返す。

$cat mogera.c
#include <ctype.h>
#include <stdio.h>
int
main()
{
printf("isupper('A')==%d\n", isupper('A'));
printf("islower('A')==%d\n", islower('A'));
printf("isupper('z')==%d\n", isupper('z'));
printf("islower('z')==%d\n", islower('z'));

return 0;
}

isupper('A')==1
islower('A')==0
isupper('z')==0
islower('z')==2

flag1 = islower(x);
flag2 = isupper(x);

if(flag1 == 1){
buffer[i] = toupper(buffer[i]);
}else if(flag2 == 1){
buffer[i] = tolower(buffer[i]);
}

flagって名前のフラグ変数もどうにかして欲しいけどそれはおいといて、
isupper/islower なんかの戻り値は0/1とは限りません。


Manpage of ISALPHA
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/isspace.3.html
文字 c が調べた文字の種類に合っていれば 0 以外を返す。そうでなければ 0 を返す。

$cat mogera.c
#include <ct...続きを読む

QC言語 最大値と最小値を求めて表示するプログラム

はじめまして。

C言語を学習中です。

下記の問題演習の解答として記載されているプログラムがどうしても理解できません。

特にプログラムの最後の方のwhile文で最大値と最小値の判定をしているのかと思いますが、どのような計算をして判定しているのでしょうか。

while (array[i] != -1) {
if (array[i] > *max) *max = array[i];
if (array[i] < *min) *min = array[i];
i++;

具体的に教えてください。

よろしくお願い致します。


●問題
0~100の範囲で入力された複数の数値の中から、
最大値と最小値を求めて表示するプログラムを作成せよ。
-1が入力された場合は入力の終わりと判定する。
ただし、最大値と最小値はmain関数以外の一つの関数の中で求める。
また、入力された数値を記憶する配列の要素数は10とし、
それ以上入力された場合はエラーが起きても仕方ないこととする。
ヒント:配列の中に -1 があればデータの終わりだと判断できる。
ヒント:最小値を探すには、最大値を記憶した変数との比較を繰り返せば良い。


●解答
#include <stdio.h>

void maxmin(int array[],int *max,int *min);

int main(void)
{
int i = 0,array[10],max,min;

do {
printf("%d 番目の数:",i + 1);
scanf("%d",&array[i]);
i++;
} while (array[i - 1] != -1);

maxmin(array,&max,&min);

printf("最大値 %d : 最小値 %d\n",max,min);

return 0;
}

void maxmin(int array[],int *max,int *min)
{
int i = 0;

*max = 0;
*min = 100;

while (array[i] != -1) {
if (array[i] > *max) *max = array[i];
if (array[i] < *min) *min = array[i];
i++;
}
}

はじめまして。

C言語を学習中です。

下記の問題演習の解答として記載されているプログラムがどうしても理解できません。

特にプログラムの最後の方のwhile文で最大値と最小値の判定をしているのかと思いますが、どのような計算をして判定しているのでしょうか。

while (array[i] != -1) {
if (array[i] > *max) *max = array[i];
if (array[i] < *min) *min = array[i];
i++;

具体的に教えてください。

よろしくお願い致します。


●問題
0~100の範囲で入力された複数の数値の中から、
最大値と最小値を求...続きを読む

Aベストアンサー

>while (array[i] != -1) {
>if (array[i] > *max) *max = array[i];
>if (array[i] < *min) *min = array[i];
>i++;

手でコードを追いかけていくのが上達への近道だとは思いますが…。

今回は、データの範囲が0~100と決まっていますので、
まずは、仮の最大値として下限の0を、仮の最小値として上限の100を、
それぞれセットしています。
そして、配列の中身を、その時点での最大値や最小値と比べて、
データの方がその時点での最大値よりも大きければ最大値の値を更新し、
データの方がその時点での最小値よりも小さければ最小値の値を更新する、
というアルゴリズムです。

ループを脱出した(つまり、すべてのデータをチェックし終わった)段階で
変数maxやminに入っている値が、(仮ではない)真の最大値や最小値となります。


人気Q&Aランキング

おすすめ情報