2016-05-01 255 views
0

我想绘制一些数据。我在下面写的脚本以前工作得很好,但现在我不知道为什么它不起作用。如何让我的Matlab脚本中的矢量长度相同?

下面是代码:

x = [335,41,14,18,15,9,7,9,20607,5,5,143,3,5,72,134,2,28,172,3,72,173,280,186,20924,1,1,22,3,3,1,2,13,1,3,2,11,66,12983,176,123,192,64,258,182,123,299,58,198,7,113,342,72,8376,122,20,19,2,3,28,8,36,8,56,43,2,48,127,395,4664,186,46,236,219,258,69,203,189,169,72,100,78,109,46,112,3929,272,40,4,31,2,97,36,5,35,56,2,237,1672,256,224,28,163,341,151,263,157,397,94,380,173,75,87,272,1194,133,6,112,1,6,2,26,25,64,8,40,57,106,525,150,248,125,269,264,256,357,153,64,152,283,1,2,2,454,154,39,1,1,64,151,242,1,18,99,1,36,607,55,54,110,225,108,37,1,144,162,137,107,21,360,362,18,51,25,43,1,3,6,1,27,7,45,326,32,103,50,124,155,39,180,143,33,116,46,7,151,120,19,4,2,4,110,2,7,4,9,4,27,216,323,148,1,1,2,1,47,113,150,1,2,144,16,4827,1,1,1,14]; 
size = length(x); 
disp(size); 
z = 0; 
for i = 1:size 
    z = z + 1; 
    y(i) = z; 
end 
scatter(x,y); 

此代码应确保y是相同的长度作为x因为我们仅在y填充只要x是(因为我们使用一个for循环从1通过到size,其中size基本上是x中的索引数),但是我一直收到这个错误。我检查了disp,结果发现我的x和y向量有不同的长度,x是227,y是256.有谁能帮我解决这个小问题吗?

回答

2

这很可能是因为y在您运行您向我们显示的那段代码之前创建的大小不同。在你调用这段代码之前,在你的脚本的某个地方,y被创建为一个256元素的向量,现在你通过填充y向量中的元素来重用这部分代码中的这个变量。变量x有227个元素,并且您所写的循环将更改y的前227个元素,因为您的循环次数与x中的元素的次数相同。然而,其余的29个元素仍然在那里。重复使用变量y可能是为什么你的脚本失败,因为现在两个变量之间的大小不一样。因此,明确重新调用y之前致电scatter

实际上,for循环根本就不需要。循环的目的是创建一个从1到多个元素的递增数组,与您在x中一样多。

只是这样做,而不是:

y = 1:size; 

我也不喜欢你正在创建一个名为size变量。它掩盖了函数size,该函数查找输入数组包含的每个维度中的元素数量。

用我上面所陈述的建议,这个替换整个代码:

x = [335,41,14,18,15,9,7,9,20607,5,5,143,3,5,72,134,2,28,172,3,72,173,280,186,20924,1,1,22,3,3,1,2,13,1,3,2,11,66,12983,176,123,192,64,258,182,123,299,58,198,7,113,342,72,8376,122,20,19,2,3,28,8,36,8,56,43,2,48,127,395,4664,186,46,236,219,258,69,203,189,169,72,100,78,109,46,112,3929,272,40,4,31,2,97,36,5,35,56,2,237,1672,256,224,28,163,341,151,263,157,397,94,380,173,75,87,272,1194,133,6,112,1,6,2,26,25,64,8,40,57,106,525,150,248,125,269,264,256,357,153,64,152,283,1,2,2,454,154,39,1,1,64,151,242,1,18,99,1,36,607,55,54,110,225,108,37,1,144,162,137,107,21,360,362,18,51,25,43,1,3,6,1,27,7,45,326,32,103,50,124,155,39,180,143,33,116,46,7,151,120,19,4,2,4,110,2,7,4,9,4,27,216,323,148,1,1,2,1,47,113,150,1,2,144,16,4827,1,1,1,14]; 
numX = numel(x); 
y = 1 : numX; 
scatter(x,y); 

矢量y现在明确创建的,而不是重用这是在过去一个以前的大小创建的变量。它也使用冒号操作符来显式创建该序列,而不是使用for循环。那for循环就是不需要的。 numel确定输入矩阵的元素总数。我不喜欢使用length作为个人偏好,因为它找到了最大维度中的元素数量。这对于向量来说可能工作得很好,但它确实使我很难发现过去编写的代码中的错误。

+0

感谢您的帮助。我习惯在其他编程语言中循环,因此不得不使用for循环。谢谢 – theprogrammer094

+0

@ rohitkrishna094已更改。谢谢。顺便说一句,如果你想避免你当前的代码出现这个问题,你可以在运行你的代码之前明确**清除**'y'。在运行这段代码之前,要么执行'clear y;'或'y = [];'但是我会仍然使用冒号操作符来创建该序列。 – rayryeng

+0

哦,好的。请记住这一点,谢谢。 – theprogrammer094

相关问题