【问题标题】:Matlab - Nested loop for certain columnMatlab - 某些列的嵌套循环
【发布时间】:2014-11-11 23:12:47
【问题描述】:

我有一个大小为500x5 的数据集数组M,有什么方法可以使用嵌套的for 循环遍历数组的特定列?如果是这样,我将如何去做?我希望循环中的if 语句类似于:

if age <= 80
  age = 1
else 
  age = 2
end  

我会在for 循环中添加什么?将变量初始化为young =1; old = 2; 然后在if 语句中使用age = young 而不是age = 1 会更好吗?我正在尝试将数据离散化为12,其中1 很年轻,2 很老。

【问题讨论】:

标签: arrays matlab loops if-statement nested


【解决方案1】:

试试这个:

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;

【讨论】:

【解决方案2】:

这可以通过多种方式完成。您可以像您所说的那样使用嵌套的 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 = 1old = 2 的信息。但是,它是首选,因为它允许您删除 Magic Numbers

编辑回答后续问题:

要将结果保存在原始数组中,您可以执行以下操作:

  1. 您可以在最后将新数组分配给旧数组的一列
  2. 您可以在循环时分配新值
  3. 您可以使用 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

【讨论】:

  • 感谢您非常有帮助和详细的回答,再问一个问题;是否可以将结果保存在 M 本身的列而不是新数组中?例如遍历第 3 列并将 1 或 2 的结果保存在 M 本身的第 3 列中。
  • 非常感谢,这帮助很大:)
猜你喜欢
  • 2014-06-10
  • 2016-03-17
  • 2017-07-26
  • 1970-01-01
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多