我有一个大小为M
的数据集数组500x5
,有没有什么方法可以使用嵌套的for
循环来运行数组的特定列?如果是这样,我该怎么做呢?我希望循环中的if
语句类似于:
if age <= 80
age = 1
else
age = 2
end
我将for
循环放在什么位置?将变量初始化为young =1; old = 2;
然后在age = young
语句而不是if
中使用age = 1
会更好吗?我试图将数据分为1
或2
,其中1
为年轻且2
为旧。
答案 0 :(得分:2)
试试这个:
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;
答案 1 :(得分:0)
这可以通过多种方式完成。你可以使用嵌套的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
但是,您说您想要对数据进行去除,因此您可能希望更改保存所有结果。上面的例子将为您提供一个名为&#39; age&#39;的变量。它只会存储循环中的最后一个值。
以下内容应允许您保存单个列的所有结果:
%// 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
的内容。但是,它是首选,因为它允许您删除Magic Numbers。
编辑回答后续行动:
要将结果保存在原始数组中,您可以执行以下操作:
第一个很容易......使用上面最后两个程序之一,然后执行此操作:
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