matlab简单的循环

时间:2014-04-22 13:11:14

标签: matlab loops for-loop

我有200行数据,我试图从第3列中提取第1列中的特定数字,这些数字与第1列中的1,2,3或4(重复随机)相关。

我可以使用

在第3列中获得与第1列中的1相关的数字
E=C(C(:,1)==1,[3]);

所以我假设我可以通过使用这个循环提取所有那些与1相关的然后到2然后到3然后到4

for i=1:4;

E=C(C(:,1)==i,[3]);

end

但我获得的是与第1列中所有4个相关的数据。如果我将其更改为1:3,我会获得与3s相关的数据。我试过写它 for i=[1,2,3,4] 但是,再次从第3列获得与第1列中的4s相关的数字。

我确定这是一个简单的错误,但任何帮助都会非常感激。 感谢。

4 个答案:

答案 0 :(得分:2)

问题是你每次循环都会覆盖E的值,所以最后你只剩下最后一次迭代。

如果您不能保证每次循环都有相同数量的结果(例如原始数据中有12 s的数量不同,那么可以使用单元格数组来存储输出:

for i=1:4;

    E{i}=C(C(:,1)==i,[3]);

end

要访问循环的第一次迭代结果(i==1),请使用E{1}(依此类推其他值)。

上述方法可让您分别访问每次迭代的结果。如果您以后决定只需要一个矩阵,并将所有这些迭代的结果组合在一起,则可以使用

cell2mat(E)

转换为所有值的数组。

答案 1 :(得分:1)

您不需要for循环来测试C中第3列中哪些数字与特定数字匹配。我使用:

C = randi(10,[200,4]); %example matrix 200x4 with integers 1-10
idx = ismember(C(:,3),[1 2 3 4]); %get indices
numbers = C(idx,3); %get numbers in C matrix

修改1:

你是说这样的意思吗?它获取包含任意数字1-4的第1,2和4列的索引,如果是这种情况,则返回第3列的值。

idx = ismember(C(:,[1 2 4]),[1 2 3 4]); %get indices
numbers = C(any(idx),3); %get numbers in C matrix

编辑2:

C=[2 586 339; 2 148 1283; 3 427 356; 1 234 476; 1 301 456; 4 235 347; 4 229 587; 3 156 438]

for k=1:4
%or add a for loop if you want the numbers of column 2 and 3 separately
   C(C(:,1)==k,2:3)  
end

ans =

   234   476
   301   456


ans =

   586    339
   148   1283


ans =

   427   356
   156   438


ans =

   235   347
   229   587

答案 2 :(得分:0)

试试这个 -

E = C(ismember(C(:,1),[1 2 3 4]),3)

修改1:

C(~ismember(C(:,1),[1 2 3 4]),:)=[];
[~,y1] = sort(C(:,1));
E = C(y1,3)

答案 3 :(得分:0)

如果您需要分别获取与12等对应的元素:使用accumarray

result = accumarray(C(:,1),C(:,3),[],@(x) {x});

使用此方法,result{1}包含列3为列1 1的所有元素,result{2}包含列{{1}的所有元素} 3列为1等。这些元素可能不是原始顺序。