gpt4 book ai didi

在C中通过memcpy将一个矩阵复制到另一个矩阵

转载 作者:行者123 更新时间:2023-11-30 15:37:16 35 4
gpt4 key购买 nike

我想编写一个函数,通过使用 memcpy 将两个矩阵复制到一个矩阵中。就像 C = [A; B]在Matlab中。因为,我想对所有类型的数据使用这个函数,这意味着整数和浮点矩阵,我使用了 void 指针。

代码是:

void Repmatrix(void *M3, void *M1, int R1, int C1, void *M2, int R2, int C2, size_t t)
{
if (RC == 'R')
{
int i;
for (i = 0; i < R1*C1; i++)
{
memcpy(M3+i, M1+i, t);

}
for (j = 0; j < R1*C1; j++)
{
memcpy(M3+i+j, M1+j, t);

}
}
}

感谢任何帮助和建议。

为了澄清这一点,输入是:

M1 = [
1 2
3 4]
M2 = [
5 6
7 8]

输出应该是:

M3 = [
1 2
3 4
5 6
7 8]

最佳答案

首先,有一些简单的索引错误,可能是因为您复制并粘贴了循环:第二个循环应使用 M2C2R2 .

然后,正如其他人指出的那样,您不能对 void * 进行算术运算。空指针只是匿名句柄。如果您想对它们执行某些操作,则应该将它们转换为指向值类型的指针。 (GCC 似乎允许对 void * 进行算术运算,并将它们视为 char *;它仅在 -pedantic 模式下发出警告。)

因为您不知道函数中的值类型,只知道其大小,所以将它们转换为 char *,因为 sizeof(char) == 1。然后你可以在指针算术中使用你的大小t,如下所示:

void Repmatrix(void *M3, 
void *M1, int R1, int C1,
void *M2, int R2, int C2, size_t t)
{
char *MM1 = M1;
char *MM2 = M2;
char *MM3 = M3;
int i, j;

for (i = 0; i < R1*C1; i++) {
memcpy(MM3 + i * t, MM1 + i * t, t);
}

for (j = 0; j < R2*C2; j++) {
memcpy(MM3 + (i + j) * t, MM2 + j * t, t);
}
}

您实际上不需要循环,因为如果您以行主格式存储矩阵,则上半部分和下半部分的内存是连续的:

void Repmatrix(void *M3,
void *M1, int R1, int C1,
void *M2, int R2, int C2, size_t t)
{
char *top = M3;
char *btm = top + R1 * C1 * t;

memcpy(top, M1, R1 * C1 * t);
memcpy(btm, M2, R2 * C2 * t);
}

一种类型更安全的变体是坚持使用 double 作为矩阵值并使用 double * 指针:

void Repmatrix(double *M3,
double *M1, int R1, int C1,
double *M2, int R2, int C2)
{
memcpy(M3, M1, R1 * C1 * sizeof(*M3));
memcpy(M3 + R1 * C1, M2, R2 * C2 * sizeof(*M3));
}

您仍然需要使用 sizeof,因为 memcpy 使用 void 指针,但您会发现将错误的指针类型传递给 的情况Repmatrix.

关于在C中通过memcpy将一个矩阵复制到另一个矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22280140/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com