Matlab - 某些列的嵌套循环

时间:2014-11-11 23:12:48

标签: arrays matlab loops if-statement nested

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

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

我将for循环放在什么位置?将变量初始化为young =1; old = 2;然后在age = young语句而不是if中使用age = 1会更好吗?我试图将数据分为12,其中1为年轻且2为旧。

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 = 1old = 2的内容。但是,它是首选,因为它允许您删除Magic Numbers

编辑回答后续行动:

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

  1. 您可以将新数组分配给最后一个旧数组的列
  2. 您可以在循环时分配新值
  3. 您可以使用条件替换Rodrigo提及。
  4. 第一个很容易......使用上面最后两个程序之一,然后执行此操作:

    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