这可以通过多种方式完成。您可以像您所说的那样使用嵌套的 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 的条件赋值技巧。以下将产生与最后一个代码 sn-p 相同的结果:
%// now without loops
age = zeros(500,5);
age(M <= 80) = 1;
age(M > 80) = 2;
(请注意,我在我的 cmets 中使用了 % 和 //...您可以忽略 // 因为我只是添加它以便 Stack Exchange 可以识别我的 cmets)
要回答您的后续问题,无需添加有关young = 1 和old = 2 的信息。但是,它是首选,因为它允许您删除 Magic Numbers。
编辑回答后续问题:
要将结果保存在原始数组中,您可以执行以下操作:
- 您可以在最后将新数组分配给旧数组的一列
- 您可以在循环时分配新值
- 您可以使用 Rodrigo 提到的条件替换。
第一个很简单...使用上面最后两个过程之一,然后执行以下操作:
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