无法理解程序背后的逻辑

时间:2017-02-28 00:16:25

标签: c vector normalization

尝试制作一个找到向量的基本C程序,我以为自己已经到了某个地方,但我不得不停下来,不一定是错误,而是背后的逻辑。这是我的代码:

#include<stdio.h>
#include <math.h>

int norm_vec(int *x, int n) {

int i;
float modul;

for(i=0;i<n;i++;)
   {
       modul=++ x[i]*x[i];
   }
       modul = sqrt(modul);

         for(i=0;i<n;i++;)
            {
              x[i] = x[i]/modul
            }
}

2 个答案:

答案 0 :(得分:2)

通过将问题分解为更小的部分,您将有更轻松的时间。归一化矢量需要将矢量的每个分量除以矢量的幅度。因此,您需要一种计算量级的方法。这是一件非常普遍的事情,所以它保证了自己的功能。

您也可能想要一种打印矢量的方法,这样您就可以看到您的功能正如您所期望的那样工作。我为Vector编写了一个打印函数示例。

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>

typedef struct Vector {
    int *components;
    int arity;
} Vector;

double squaredMagnitude(Vector);
double magnitude(Vector);
void normalize(Vector);
void printVector(Vector);

double squaredMagnitude(Vector v) {
    double sum = 0;
    for (int i = 0; i < v.arity; i++) {
        int component = v.components[i];
        sum += component * component;
    }
    return sum;
}

double magnitude(Vector v) {
    return sqrt(squaredMagnitude(v));
}

void normalize(Vector v) {
    double mag = magnitude(v);
    for (int i = 0; i < v.arity; i++) v.components[i] /= mag;
}

void printVector(Vector v) {
    printf("{");
    for (int i = 0; i < v.arity - 1; i++) printf("%i, ", v.components[i]);
    if (v.arity != 0) printf("%i", v.components[v.arity - 1]);
    printf("}\n");
}

int main() {
    int components[] = {0, 5, 0};
    int componentCount = sizeof(components) / sizeof(*components);

    Vector v;
    v.components = malloc(componentCount);
    memcpy(v.components, components, sizeof(components));
    v.arity = componentCount;

    normalize(v);

    printVector(v);
}

答案 1 :(得分:1)

让我首先整理你的代码,以便它更具可读性并纠正一些错误。

#include <stdio.h>
#include <math.h>

int norm_vec(int * x, int n)
{
    int i;
    // initialize it at 0 for good practice
    // to my knowledge if you don't initialize a float, it will be 0, but let's stay safe
    float modul = 0;

    for (i = 0; i < n; i++) {
        modul += x[i]*x[i];
    }

    modul = sqrt(modul);

    for (i = 0; i < n; i++) {
        x[i] = x[i] / modul;
    }
}

现在对我来说,你的代码似乎在数学上是正确的。您首先计算向量的范数(您称之为modul),然后将向量的每个分量除以范数,这就是规范化。

但是,你的函数应该返回一个int但它什么都不返回。你应该决定如何处理它。它应该恢复正常还是什么?