在矩阵中追加行

时间:2017-02-01 11:53:39

标签: matlab

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次。

为什么会这样?

2 个答案:

答案 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