我有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相关的数字。
我确定这是一个简单的错误,但任何帮助都会非常感激。 感谢。
答案 0 :(得分:2)
问题是你每次循环都会覆盖E
的值,所以最后你只剩下最后一次迭代。
如果您不能保证每次循环都有相同数量的结果(例如原始数据中有1
和2
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)
如果您需要分别获取与1
,2
等对应的元素:使用accumarray
:
result = accumarray(C(:,1),C(:,3),[],@(x) {x});
使用此方法,result{1}
包含列3
为列1
1
的所有元素,result{2}
包含列{{1}的所有元素} 3
列为1
等。这些元素可能不是原始顺序。