好的,这有点难以解释,但我有一个长的.txt文件包含数据(只有一列)。它看起来像这样:
data=[18
32
50
3
19
31
48
2
18
33
51
4]
现在,每四个值(例如18,19,18)代表相同的物理量,仅来自不同的测量值。现在,我希望Matlab获取每个第四个值并将其放入数组X=[18 19 18]
中,并且对于其他数量也是如此。
到目前为止我的解决方案看起来像这样:
for i=1:3;
for j=1:4:12;
X(i)=data(j);
end
end
...在此示例中,因为每个数量中有三个(因此i=1:3
),并且总共有12个数据点(因此j=1:4:12
,步骤为4)。 data
只是加载的数据点列表(这很好,我可以在命令窗口中测试它 - 例如data(2)=32
)。
我的问题是这样做,我的数组就像X=[18 18 18]
一样 - 即只有最后一次迭代被放入数组
当然,最后,我想为所有要点做这件事;将第2,第6和第10个数据点保存到Y
,依此类推。但我想这只是有更多的for
- 循环。
我希望这个问题有道理。我想这是一个容易解决的问题。
答案 0 :(得分:4)
你为什么不这样做?
>> X = data(1:4:end)
X =
18
19
18
>> Y = data(2:4:end)
Y =
32
31
33
答案 1 :(得分:3)
您可以对数据进行整形,然后将其拆分为不同的变量,或者只知道每列是不同的变量(我现在假设每次测量的次数相同,即length(data)
是一个倍数4
)
data = reshape(data, 4, []).';
现在如果你想要
X = data(:,1);
Y = data(:,2);
%// etc...
但您也可以将data
全部保留在一个变量中,因为调用data(:,1)
几乎不会比X
更麻烦。
现在,你应该不使用for
- 循环,但是我想解决你的循环出了什么问题以及如何使用循环解决这个问题纯粹作为对逻辑。你有一个嵌套循环:
for i=1:3;
for j=1:4:12;
X(i)=data(j);
end
end
现在你所希望的是i
和j
每一次都会向前移动一次迭代。因此,当i==1
然后j==1
,i==2
然后j==5
等时,但这不是发生的事情。为了更好地理解发生了什么,我建议你在每次迭代时打印出变量:
disp(sprintf('i: \tj:'));
for i=1:3;
for j=1:4:12;
disp(sprintf(' %d\t %d',i,j));
end
end
打印出来
i: j:
1 1
1 5
1 9
2 1
2 5
2 9
3 1
3 5
3 9
你想要的是
disp(sprintf('i: \tj:'));
for i=1:3;
disp(sprintf(' %d\t %d',i,4*i-3));
end
输出:
i: j:
1 1
2 5
3 9
适用于您的问题:
%// preallocation!
X = zeros(size(data,1)/4, 1)
for i=1:3
X(i)=data(i*4 - 3);
end
或者,您可以单独计算i
或j
:
%// preallocation!
X = zeros(size(data,1)/4, 1)
i = 1;
for j=1:4:end;
X(i)=data(j);
i = i+1;
end
答案 2 :(得分:2)
为了完整起见,您自己的解决方案应该已经阅读
i = 0;
for j=1:4:12;
i = i+1;
X(i)=data(j);
end
当然,am304的答案是一种更好的方法。