c - 使用指向数组的 void 指针来乘以矩阵

标签 c matrix matrix-multiplication

我正在尝试在 C 中进行矩阵乘法。乘法函数也称为点积函数。以下是函数和我得到的 3 个错误:

char dotProduct(void *A, void *B, int N, int i, int j) {
    char result;

    while(i < N - 1) {
        while(j < N - 1) {
            result += A[N * i + j] * B[N * i + j];                 // error: invalid operands to binary expression ('void' and 'void')

            j++;
        }

        i++;
    }

    return result;
}

void multiply(void *A, void *B, void *C, int N) {
    for(int i = 0; i < N - 1; i++) {
        for(int j = 0; j < N - 1; j++) {
            C[N * i + j] = 0;                                     // error: incomplete type 'void' is not assignable 

            for(int k = 0; k < N - 1; k++) {
                C[N * i + j] += dotProduct(A, B, N, i, j);        // error: subscripted value is not an array , pointer or vector
            }
        }
    }
}

我不确定这些错误的含义。例如,“下标值不是数组、指针或 vector ”:它是一个数组,我不知道为什么我不能执行该操作。另外,另外2个,我不明白他们的意思。有人可以详细说明一下吗?

最佳答案

如果您要使用void,您还需要传递数组的步长,否则元素的间距是未知的。如果您使用 8、16 或 32 位 float (或整数),则需要表达这一点,否则编译器不知道元素之间的间距是多少,也不知道指针增量应该在内存中多远。即使您传入一个跨步,编译器也不知道您乘以两个 void 时的含义。

如果我用 C 语言执行此操作,我可能会编写类型化版本,或模拟如下 C++ 模板:

#define DEFN_DOT_PRODUCT(TYPE, suffix) TYPE dotProduct##suffix(TYPE *A, TYPE *B, int N, int i, int j) { \
    TYPE result = 0; \
    while(i < N - 1) { \
        while(j < N - 1) { \
            result += A[N * i + j] * B[N * i + j]; \
            j++; \
        } \
        i++; \
    } \
    return result; \
}
DEFN_DOT_PRODUCT(int, i);
DEFN_DOT_PRODUCT(float, f);
DEFN_DOT_PRODUCT(double, d);
#undef DEFN_DOT_PRODUCT

/* use */
dotProducti(/* whatever */)

关于c - 使用指向数组的 void 指针来乘以矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53037118/

相关文章:

python - 将 numpy 矩阵相加

r - 加速 R 中的稀疏矩阵乘法

c++ - 矩阵乘法性能,int 与 double

c - 使用文件输入的 C 矩阵乘法

c - 如何将 char 转换为 unsigned int?

c - 我应该使用什么数据类型在 C 中存储超过 25 位数字?

C - 读()和写()

c - 为什么我的变量没有被保存?我一直在测试这段代码,但我的变量没有保存到我的结构数组中

c++ - 将列 vector 从矩阵复制到opencv中另一个矩阵的每个列

R-如何从距离矩阵中获取匹配元素的行和列下标