对于 n>140,GSL gsl_blas_sgemm 矩阵乘法非常不准确

发布于 2024-11-06 05:10:24 字数 71 浏览 3 评论 0原文

只是为了使用 gsl_blas_sgemm 函数测试所有 150x150 矩阵的乘法。我收到的错误高达 38。为什么这么不准确?

Just to test a multiplied a 150x150 matrix of all ones by itself using the gsl_blas_sgemm function. I'm getting errors of up to 38. Why is it so inaccurate?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

蓝海似她心 2024-11-13 05:10:24

你确定你叫得对吗?我没有问题:

#include <stdio.h>
#include <gsl/gsl_matrix.h>
#include <gsl/gsl_blas.h>

int main(int argc, char **argv) {
    gsl_matrix_float *a, *b;
    float err, maxerr;
    int n;

    if (argc != 2) {
        fprintf(stderr,"Usage: %s n\n\tWhere n is size of matrix.\n", argv[0]);
        exit(-1);
    }

    n = atoi(argv[1]);
    if (n<2 || n > 1000) {
        n = 100;
        fprintf(stderr,"%s: invalid n = %s; using n = %d.\n",
                argv[0], argv[1], n );
    }

    a = gsl_matrix_float_alloc(n,n);
    b = gsl_matrix_float_alloc(n,n);

    for (int i=0; i<n; i++)
        for (int j=0; j<n; j++)
            gsl_matrix_float_set(a,i,j,1.);

    gsl_blas_sgemm (CblasNoTrans, CblasNoTrans, 1., a, a, 0., b);

    maxerr = 0.;
    for (int i=0; i<n; i++) {
        for (int j=0; j<n; j++) {
            err = gsl_matrix_float_get(b,i,j)-(float)n;
            if (err > maxerr) maxerr = err;
        }
    }

    printf("Maxerr = %f\n", maxerr);

    gsl_matrix_float_free(a);
    gsl_matrix_float_free(b);
    return 0;
}

然后

$ gcc -o gslblas gslblas.c -lgsl -lgslcblas -std=c99
$ ./gslblas 150
Maxerr = 0.000000

Are you sure you're calling it right? I have no problems:

#include <stdio.h>
#include <gsl/gsl_matrix.h>
#include <gsl/gsl_blas.h>

int main(int argc, char **argv) {
    gsl_matrix_float *a, *b;
    float err, maxerr;
    int n;

    if (argc != 2) {
        fprintf(stderr,"Usage: %s n\n\tWhere n is size of matrix.\n", argv[0]);
        exit(-1);
    }

    n = atoi(argv[1]);
    if (n<2 || n > 1000) {
        n = 100;
        fprintf(stderr,"%s: invalid n = %s; using n = %d.\n",
                argv[0], argv[1], n );
    }

    a = gsl_matrix_float_alloc(n,n);
    b = gsl_matrix_float_alloc(n,n);

    for (int i=0; i<n; i++)
        for (int j=0; j<n; j++)
            gsl_matrix_float_set(a,i,j,1.);

    gsl_blas_sgemm (CblasNoTrans, CblasNoTrans, 1., a, a, 0., b);

    maxerr = 0.;
    for (int i=0; i<n; i++) {
        for (int j=0; j<n; j++) {
            err = gsl_matrix_float_get(b,i,j)-(float)n;
            if (err > maxerr) maxerr = err;
        }
    }

    printf("Maxerr = %f\n", maxerr);

    gsl_matrix_float_free(a);
    gsl_matrix_float_free(b);
    return 0;
}

and then

$ gcc -o gslblas gslblas.c -lgsl -lgslcblas -std=c99
$ ./gslblas 150
Maxerr = 0.000000
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文