ベクトルが与えられた時にノルムを求めるアルゴリズムについて
前提
ベクトル(v = (v1, v2, ...vn)^T))が与えられた時にノルム(√(v^(T)v))を求めるアルゴリズムを考えて、c言語で実装しようとしています。
実現したいこと
①擬似コードで文章になっている部分をどのように記号で表せるのか知りたい
②擬似コードのアルゴリズムを実行するためには、どのように参考記事のプログラムを変更するべきか知りたい
ベクトルが与えられた時にノルムを求める、実装したいアルゴリズムの擬似コード
norm <- 0
next_address <- v
while next_address != NULL do
current_cell <- *(next_address)
norm <- (ベクトルの要素を2乗したものを足していくと考えられるが、擬似コードでどのようにかいたらいいかわからない)
next_address <- (現在のセルのポインタが指すインデックスだと考えられるが、似コードでどのようにかいたらいいかわからない)
return sqrt(norm)
参考記事のノルムを計算するプログラム
#include <stdio.h>
#include <math.h>
/* ---------------------------------------------
ベクトルの長さを求める
引数1: vec ベクトル
引数4: n ベクトルの要素数
戻り値 vecの長さ
---------------------------------------------*/
double norm(double *vec, int n)
{
int i;
double s = 0.0;
for ( i = 0; i < n; i++ ) {
s += vec[i] * vec[i];
}
return sqrt(s);
}
/* main */
int main(void)
{
double vec[] = {1.0, 2.0, 3.0};
int n = 3;
/* ベクトルの長さを求める */
printf("ベクトルの長さ: %f\n", norm(vec, n));
return 0;
}
理解していること
10次元ベクトル(0,1,0,0,2,0,0,3,0,0)の時、以下のように書けることは理解しています。
cell *v = a;
a.index = 2; a.value = 1; a.next = &b;
b.index = 5; b.value = 2; b.next = &c;
c.index = 8; c.value = 3; c.next = NULL;