55331


**前提**  
ベクトル(v = (v1, v2,
...vn)^T))が与えられた時にノルム(√(v^(T)v))を求めるアルゴリズムを考えて、c言語で実装しようとしています。

**実現したいこと**  
①擬似コードで文章になっている部分をどのように記号で表せるのか知りたい  
②擬似コードのアルゴリズムを実行するためには、どのように参考記事のプログラムを変更するべきか知りたい

ベクトルが与えられた時にノルムを求める、実装したいアルゴリズムの擬似コード

[code]

    norm <- 0
    next_address <- v
    while next_address != NULL do
        current_cell <- *(next_address)
        norm <- (ベクトルの要素を2乗したものを足していくと考えられるが、擬似コードでどのようにかいたらいいかわからない）
        next_address <- (現在のセルのポインタが指すインデックスだと考えられるが、似コードでどのようにかいたらいいかわからない)
    return sqrt(norm)
    
[/code]

[参考記事](http://monogusa-math.blogspot.com/2009/08/blog-
post_27.html)のノルムを計算するプログラム

[code]

    #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;
    }
    
[/code]

**理解していること**  
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;

また、ノルムの定義も以下のように考えています。  
[![ノルム](https://i.stack.imgur.com/GGFN5.png)](https://i.stack.imgur.com/GGFN5.png)


CC BY-SA 4.0
2019-05-29T03:45:16.210
55329
2019-05-29T07:14:51.470
2019-05-29T03:48:50.883
19110
question
c アルゴリズム array
ベクトルが与えられた時にノルムを求めるアルゴリズムについて


質問文に書かれた10次元の場合の例を見るに、入力として与えられるベクトルはC言語の配列ではなく、何かしらの連結リストとして表現することを想定なさっているようです。

C言語の配列と連結リストは異なるデータ構造であり、質問文に引用してあるプログラムをそのまま適用することはできません。たとえば連結リストは添え字から直接（定数時間で）データにアクセスすることができません。

今回実装したいアルゴリズムは本質的には「連結リストの全ての要素を確認しながら和を求めていく」ものです。

たとえば連結リストを表す構造体が次のものだったとします。

[code]

    typedef struct cell {
        int index;           // 要素の行番号。
        int value;           // 要素の値。
        struct cell * next;  // リストの次の要素。無い場合はNULL。
    } cell;
    
[/code]

するとベクトルのノルムを求める疑似コードはこんな感じになります。

[code]

    sum <- 0.0
    while v != NULL do
        sum <- sum + v->value * v->value
        v <- v->next
    return sqrt(sum)
    
[/code]

連結リストの場合はこのように、「次の要素が存在するか調べながら、それぞれの要素を走査して足していく」形になります。

この疑似コードはほとんどC言語のコードそのものなので、このままC言語のプログラムとして書けるでしょう。


CC BY-SA 4.0
2019-05-29T04:26:43.773
55331
2019-05-29T07:14:51.470
2019-05-29T07:14:51.470
19110
19110
55329
answer