我有一个大小为M的dataset数组500x5,有任何方法可以使用嵌套的for循环来遍历数组的特定列吗?如果是这样的话,我该怎么做呢?我希望循环中的if语句类似于:
if age <= 80
age = 1
else
age = 2
end 我将把什么作为for循环?是否最好将变量初始化为young =1; old = 2;,然后在if语句中使用age = young而不是age = 1?我试图将数据离散到1或2中,1是年轻的,2是老的。
发布于 2014-11-12 00:16:19
这可以通过多种方式完成。如您所说,您可以使用嵌套的for循环,也可以像Rodrigo建议的那样使用条件赋值。
首先,这是您的数据:
%// your matrix
M = rand(500,5)*100;您可能想知道循环的行数和列数.
%// get the size for the loops
[num_rows,num_columns] = size(M);为了简单地遍历一列,以下内容应该可以工作:
%// loop through one column (column #2), save one result
col = 2;
for row = 1:num_rows
if M(row,col) <= 80
age = 1;
else
age = 2;
end
end但是,您说要去创建数据,所以您可能想要更改保存所有结果。上面的示例将留给您一个名为'age‘的变量,它只存储循环中的最后一个值。
以下内容应该允许您保存各个列的所有结果:
%// loop through one column (column #2), save all results
col = 2;
%// initialize age array
age = zeros(500,1);
%// do the loop
for row = 1:num_rows
if M(row,col) <= 80
age(row) = 1;
else
age(row) = 2;
end
end要循环遍历所有列,需要另一个for循环:
%// loop through all columns, save all results
%// initialize age array
age = zeros(500,5);
%// loop through each column
for col = 1:num_columns
%// loop through each row
for row = 1:num_rows
if M(row,col) <= 80
age(row,col) = 1;
else
age(row,col) = 2;
end
end
end最后,现在您已经看到了这一点,对于许多人来说,首选的方法是利用MATLAB的条件赋值技巧。下面将产生与最后一个代码片段相同的结果:
%// now without loops
age = zeros(500,5);
age(M <= 80) = 1;
age(M > 80) = 2;(请注意,我在评论中使用了%和// .您可以忽略//,因为我只是添加了它,这样Stack Exchange才能识别我的注释)
要回答后续的问题,没有必要添加关于young = 1和old = 2的内容。但是,它是首选的,因为它允许您删除幻数。
编辑以回答后续:
要将结果保存在原始数组中,可以执行以下几项操作:
第一个很容易..。使用上面最后两个过程中的一个,然后执行以下操作:
M(:,col_to_replace) = age(:,col_to_replace_with);或者您可以在一起添加一个新列:
M(:,6) = age(:,col_of_interest);或者,您只需更改循环,以便将原始值替换为它们的离散值:
%// loop through all columns, save all results in original locations
%// loop through each column
for col = 1:num_columns
%// loop through each row
for row = 1:num_rows
if M(row,col) <= 80
M(row,col) = 1;
else
M(row,col) = 2;
end
end
end最后,您可以只使用条件替换方法。下面的示例将用离散化值替换M的所有行和列:
M(M <= 80) = 1;
M(M > 80) = 2;要回答您的具体示例,这将遍历第1列并将结果保存在第3列中:
%// loop through one column (column #1), save all results in another column (#3)
col = 1;
save_col = 3;
%// do the loop
for row = 1:num_rows
if M(row,col) <= 80
M(row,save_col) = 1;
else
M(row,save_col) = 2;
end
end发布于 2014-11-11 23:19:00
试试这个:
m = rand(500,5)*100; //your dataset
m(m(:,ii) <= 80) = 1;
m(m(:,ii) > 80) = 2;其中ii是您想要更改的列。例如,ii =3
m(m(:,3) <= 80) = 1;
m(m(:,3) > 80) = 2;https://stackoverflow.com/questions/26876382
复制相似问题