for i = 1:6
if data(i,1) == 1
disp(i)
m(i,:) = data(i,:)
end
end
上面的代码返回一个矩阵m,其中包含来自 data 文件的数据行。
但是,对于特定数据,数据(i,1)== 1为真4次,但m有6行。 m行中的2行只是0' s,但if语句只有4次。
为什么会这样?
答案 0 :(得分:4)
在回答“为什么会发生这种情况”时,这是因为您的矩阵大小相同,但您只为满足条件的行指定值。因此,将其他行保留为0
s。
您需要一种逐行构建m
的方法(请参阅本文末尾)或以其他方式创建它(我的答案)。
您可以使用逻辑索引
执行此操作% For creating m
m = data(data(:, 1) == 1, :);
% For displaying which indices satisfy your condition, one call to disp
disp( find(data(:, 1) == 1) )
打破这一点,m
被分配给data
的值,其中data
的第1列等于1
,以及所有列。< / p>
find
返回任何非零元素的索引。逻辑索引返回0
s和1
s的数组,因此满足条件(并且1
)的所有元素都将被find
索引。
您还可以创建逻辑索引并使用它两次,如果条件发生变化,可以在以后更好地进行维护:
% create logical index
idx = ( data(:,1) == 1 );
% same as above but using idx
m = data(idx, :);
disp( find(idx) )
<强>文档强>
逻辑索引 - https://uk.mathworks.com/help/matlab/matlab_prog/find-array-elements-that-meet-a-condition.html
find
- https://uk.mathworks.com/help/matlab/ref/find.html
@Ander建议仅添加某些行将有效,并演示如何构建矩阵。但是,在这种情况下,您根本不需要循环和条件。
答案 1 :(得分:3)
这是标准的MATLAB。
假设data(1,1)
和data(3,1)
为1。
然后m(1,:)=data(1,:)
以及之后m(3,:)=data(3,:)
。但是m(2,:)
它必须存在,因为你填充了m(3,:)
。没有2没有3!
如果您希望m
仅 那些data(i,1) == 1
,那么
m=[]; %create empty matrix
for i = 1:6
if data(i,1) == 1
disp(i)
m= [m; data(i,:)]; % "append" to m
end
end