C 言語で内積と外積を計算する方法

CBeginner
オンラインで実践に進む

はじめに

この実験では、C プログラミングで 3D ベクトルの内積と外積を計算する方法を学びます。この実験は次の手順で構成されています。

  1. ベクトルの成分の読み込み:ユーザが 2 つの 3D ベクトルの成分を入力できるようにするプログラムを開発します。
  2. 内積または外積の計算:入力ベクトルの内積と外積を計算する関数を実装します。
  3. 結果の出力:計算された内積または外積をユーザに表示します。

この実験の終わりまでに、ベクトル演算とその C 言語での実装に関する確かな理解を得ているはずです。

ベクトルの成分の読み込み

このステップでは、内積と外積の計算のために C プログラミングでベクトルの成分を読み込む方法を学びます。ユーザがベクトルの成分を入力できるようにし、さらに数学的な演算のためにそれらを格納するプログラムを作成します。

まず、ベクトル演算用の新しい C ファイルを作成しましょう。

cd ~/project
nano vector_operations.c

次に、ベクトルの成分を読み込むための関数を定義する以下のコードを追加します。

#include <stdio.h>

#define VECTOR_SIZE 3

// ベクトルの成分を読み込む関数
void readVector(float vector[], int size) {
    printf("Enter %d vector components (separated by space): ", size);
    for (int i = 0; i < size; i++) {
        scanf("%f", &vector[i]);
    }
}

int main() {
    float vector1[VECTOR_SIZE];
    float vector2[VECTOR_SIZE];

    printf("Vector 1:\n");
    readVector(vector1, VECTOR_SIZE);

    printf("Vector 2:\n");
    readVector(vector2, VECTOR_SIZE);

    return 0;
}

プログラムをコンパイルして実行し、ベクトルの入力をテストしてみましょう。

gcc vector_operations.c -o vector_operations
./vector_operations

出力例:

Vector 1:
Enter 3 vector components (separated by space): 1 2 3
Vector 2:
Enter 3 vector components (separated by space): 4 5 6
説明

このコードでは:

  • 3D ベクトルのため、定数 VECTOR_SIZE を 3 に設定しています。
  • readVector() 関数は配列とそのサイズをパラメータとして受け取ります。
  • scanf() を使用して浮動小数点のベクトル成分を読み込んでいます。
  • main() 関数は 2 つのベクトルの読み込みを示しています。

内積または外積の計算

このステップでは、C プログラミングで 3D ベクトルの内積と外積を計算する方法を学びます。前のプログラムを拡張して、ベクトルに対する数学演算を含めます。

vector_operations.c ファイルを以下のコードで更新します。

cd ~/project
nano vector_operations.c

内積と外積の計算を実装を追加します。

#include <stdio.h>

#define VECTOR_SIZE 3

void readVector(float vector[], int size) {
    printf("Enter %d vector components (separated by space): ", size);
    for (int i = 0; i < size; i++) {
        scanf("%f", &vector[i]);
    }
}

// 内積を計算する関数
float computeDotProduct(float vector1[], float vector2[], int size) {
    float dotProduct = 0.0;
    for (int i = 0; i < size; i++) {
        dotProduct += vector1[i] * vector2[i];
    }
    return dotProduct;
}

// 外積を計算する関数
void computeCrossProduct(float vector1[], float vector2[], float result[]) {
    result[0] = vector1[1] * vector2[2] - vector1[2] * vector2[1];
    result[1] = vector1[2] * vector2[0] - vector1[0] * vector2[2];
    result[2] = vector1[0] * vector2[1] - vector1[1] * vector2[0];
}

int main() {
    float vector1[VECTOR_SIZE];
    float vector2[VECTOR_SIZE];
    float crossProductResult[VECTOR_SIZE];

    printf("Vector 1:\n");
    readVector(vector1, VECTOR_SIZE);

    printf("Vector 2:\n");
    readVector(vector2, VECTOR_SIZE);

    // 内積を計算して表示
    float dotProduct = computeDotProduct(vector1, vector2, VECTOR_SIZE);
    printf("内積:%.2f\n", dotProduct);

    // 外積を計算して表示
    computeCrossProduct(vector1, vector2, crossProductResult);
    printf("外積:[%.2f, %.2f, %.2f]\n",
           crossProductResult[0],
           crossProductResult[1],
           crossProductResult[2]);

    return 0;
}

更新されたプログラムをコンパイルして実行します。

gcc vector_operations.c -o vector_operations
./vector_operations

出力例:

Vector 1:
Enter 3 vector components (separated by space): 1 2 3
Vector 2:
Enter 3 vector components (separated by space): 4 5 6
内積: 32.00
外積: [-3.00, 6.00, -3.00]
説明
  • computeDotProduct() は対応するベクトル成分を掛け合わせて内積を計算します。
  • computeCrossProduct() は標準的な 3D ベクトル外積の公式を使用して外積を計算します。
  • main() 関数は内積と外積の両方を計算して表示する方法を示しています。

結果の出力

この最終ステップでは、ベクトル演算プログラムを強化して、フォーマットされた出力を追加し、ベクトル結果を明確で読みやすい形式で出力する関数を作成します。

vector_operations.c ファイルを以下の改良実装で更新します。

cd ~/project
nano vector_operations.c

新しい出力関数を追加し、メインプログラムを修正します。

#include <stdio.h>

#define VECTOR_SIZE 3

void readVector(float vector[], int size) {
    printf("Enter %d vector components (separated by space): ", size);
    for (int i = 0; i < size; i++) {
        scanf("%f", &vector[i]);
    }
}

float computeDotProduct(float vector1[], float vector2[], int size) {
    float dotProduct = 0.0;
    for (int i = 0; i < size; i++) {
        dotProduct += vector1[i] * vector2[i];
    }
    return dotProduct;
}

void computeCrossProduct(float vector1[], float vector2[], float result[]) {
    result[0] = vector1[1] * vector2[2] - vector1[2] * vector2[1];
    result[1] = vector1[2] * vector2[0] - vector1[0] * vector2[2];
    result[2] = vector1[0] * vector2[1] - vector1[1] * vector2[0];
}

// ベクトルを出力するための新しい関数(フォーマット付き)
void printVector(const char* label, float vector[], int size) {
    printf("%s: [", label);
    for (int i = 0; i < size; i++) {
        printf("%.2f%s", vector[i], (i < size - 1) ? ", " : "");
    }
    printf("]\n");
}

int main() {
    float vector1[VECTOR_SIZE];
    float vector2[VECTOR_SIZE];
    float crossProductResult[VECTOR_SIZE];

    // ベクトルの入力
    printf("ベクトル入力:\n");
    printVector("ベクトル 1", vector1, VECTOR_SIZE);
    readVector(vector1, VECTOR_SIZE);

    printVector("ベクトル 2", vector2, VECTOR_SIZE);
    readVector(vector2, VECTOR_SIZE);

    // 結果の計算
    float dotProduct = computeDotProduct(vector1, vector2, VECTOR_SIZE);
    computeCrossProduct(vector1, vector2, crossProductResult);

    // フォーマットされた結果を出力
    printf("\nベクトル演算結果:\n");
    printVector("ベクトル 1", vector1, VECTOR_SIZE);
    printVector("ベクトル 2", vector2, VECTOR_SIZE);
    printf("内積:%.2f\n", dotProduct);
    printVector("外積", crossProductResult, VECTOR_SIZE);

    return 0;
}

更新されたプログラムをコンパイルして実行します。

gcc vector_operations.c -o vector_operations
./vector_operations

出力例:

ベクトル入力:
ベクトル 1: [0.00, 0.00, 0.00]
Enter 3 vector components (separated by space): 1 2 3
ベクトル 2: [0.00, 0.00, 0.00]
Enter 3 vector components (separated by space): 4 5 6

ベクトル演算結果:
ベクトル 1: [1.00, 2.00, 3.00]
ベクトル 2: [4.00, 5.00, 6.00]
内積: 32.00
外積: [-3.00, 6.00, -3.00]
説明
  • 一貫性のあるフォーマットでベクトルを出力する printVector() 関数を追加しました。
  • ベクトルの入力と結果の出力を示す main() 関数を強化しました。
  • ベクトルの表示と計算結果の読みやすさを向上させました。
  • ベクトルの演算結果をきれいでプロフェッショナルな形式で表示します。

まとめ

この実験では、C プログラミングでベクトル成分を読み取り、内積と外積を計算する方法を学びました。ユーザーがベクトル成分を入力すると、それらのベクトルの内積または外積を計算するプログラムを作成しました。重要な学習点は、ベクトル成分を読み取るための関数を定義すること、内積と外積の公式を実装すること、そして結果を出力することです。

このプログラムは、C で 3D ベクトルを扱う方法と、基本的なベクトル演算を適用する方法を示しています。ステップバイステップの指示に従うことで、ベクトルデータ構造を処理し、一般的なベクトル演算を実行する実践的な経験を積みました。