我试图在C中创建一个程序,将2维数组(特定矩阵)转换为单维数组。例如,如果我们有一个带L行和C列的矩阵,它应该变成一行newL = L * C.因此,如果矩阵有3行和4列,则新数组的大小将为3 * 4 = 12。
矩阵应转向:
1 2
--> 1 2 3 4
3 4
我现在面临的问题是如何在没有随机值或重复值的情况下将矩阵分配给数组。
我关注的那段代码是这样的:
for(k=1;k<=t;k++)
{
for(i=1;i<=l;i++)
{
for(j=1;j<=c;j++)
{
v[k]=m[i][j];
}
}
}
k,i和j是矩阵(2维数组)和数组的计数器。其中两个; i和j是矩阵的计数器,k是数组的计数器。请注意,它们中的每一个都从1开始并且达到它的大小,在这个大小中,我将使用2行和2列作为矩阵,因此数组的大小为4(2 * 2)。
执行代码会将此作为回报:
1 2
--> 4 4 4 4
3 4
简单地说,这段代码总是将矩阵的最后一个值赋给数组。因此,如果我在矩阵中用5替换4,则阵列将具有5 5 5 5。
修改
以下是了解我尝试做的完整代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int c,i,j,l,k,t;
printf("Donner le nombres des lignes: ");
scanf("%d",&l);
printf("Donner le nombres des colonnes: ");
scanf("%d",&c);
int m[l][c];
t=l*c;
int v[t];
for(i=0;i<l;i++)
{
for(j=0;j<c;j++)
{
printf("Donner m[%d][%d]: ",i+1,j+1);
scanf("%d",&m[i][j]);
}
}
for(i=0;i<l;i++)
{
for(j=0;j<c;j++)
{
printf("%d\t",m[i][j]);
}
printf("\n");
}
printf("\n\n\n\n");
for(k=1;k<=t;k++)
{
for(i=1;i<=l;i++)
{
for(j=1;j<=c;j++)
{
v[k]=m[i][j];
}
}
}
for(k=0;k<t;k++)
{
printf("%d\t",v[k]);
}
system("pause");
}
谢谢大家的帮助,我找到了正确的方法。
答案 0 :(得分:1)
因此,我们有:
for(k = 0, i = 0; i < o; i++)
{
for(j = 0; j < p; j++)
{
v[k++] = m[i][j];
}
}
其中o
和p
- 矩阵的维度m
答案 1 :(得分:1)
如果我们有这样的多维数组:
int nums[3][3];
我们有:
int all[9];
我们得到了:
int a, b;
我们会像这样引用每个词:
nums[a][b];
现在想想a和b的实际值是什么:
for (a = 0; a < 3; a++) {
for (b = 0; b < 3; b++)
all[((a * 3) + b)] = nums[a][b];
}
只要你将a乘以它将迭代的元素数量,这将有效:
int nums[5][5];
int all[25];
int a, b;
for (a = 0; a < 5; a++) {
for (b = 0; b < 5; b++)
all[((a * 5) + b)] = nums[a][b];
}
答案 2 :(得分:1)
您提到的问题是&#34;如何修复代码?&#34;我想很多人都给了你正确的答案。这是您的代码以及更正后的代码。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int c,i,j,l,k,t;
printf("Donner le nombres des lignes: ");
scanf("%d",&l);
printf("Donner le nombres des colonnes: ");
scanf("%d",&c);
int m[l][c];
t=l*c;
int v[t];
for(i=0;i<l;i++)
{
for(j=0;j<c;j++)
{
printf("Donner m[%d][%d]: ",i+1,j+1);
scanf("%d",&m[i][j]);
}
}
for(i=0;i<l;i++)
{
for(j=0;j<c;j++)
{
printf("%d\t",m[i][j]);
}
printf("\n");
}
printf("\n\n\n\n");
/* corrected code below */
k = 0;
for(i=0;i<l;i++)
{
for(j=0;j<c;j++)
{
v[k]=m[i][j];
k++;
}
}
/* corrected code above */
for(k=0;k<t;k++)
{
printf("%d\t",v[k]);
}
system("pause");
}
答案 3 :(得分:0)
此:
for(k=1;k<=t;k++)
for(i=1;i<=l;i++)
for(j=1;j<=c;j++)
v[k]=m[i][j];
不符合你的想法。想想当你第一次遍历j
部分时,你将在整个时间内设置v的所有0th
元素,最后你设置的最后一个值将会坚持(即位置{{} 1}}碰巧是1, 1
)。然后,您会将4
增加到k
并再次重复,从而产生所有1
。你想要这个:
4's
确保您的 for(i = 0; i < l; i++)
for(j = 0; j < c; j++)
v[i*l+j] = m[i][j]; // i*l + j gives you the equivelent position in a 1D vector.
矢量尺寸正确,即。 v
。还记得在int v[l*c];
中使用零索引。如果你确实需要基于1的索引(你不...),那么这样做:
c
但请记住,这将对此向量进行任何进一步操作 Gross 。所以不要这样做....
答案 4 :(得分:0)
只要新数组的大小正确,就可以使用以下内容:
k=0;
for(i=0;i<l;i++){
for(j=0;j<c;j++){
v[k]=m[i][j];
k++;
}
}
基本上,您遍历矩阵(您的行和列 - 正如您所说)并同时增加新数组中您希望放置该值的位置(k)。
答案 5 :(得分:0)
如果您只想将矩阵元素作为单维数组访问,则可以声明int
指针v
:
int m[3][4];
int *v = (int*)m;
// then access for example m[1][1] as v[5]
或者,要实际复制数组,请使用双for
(与其他答案一样),单个for
如下
int vv[12];
for(i = 0; i < 12; i++)
vv[i] = m[i/4][i%4];
或只使用memcpy
:
memcpy(vv, m, 12*sizeof(int));