首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Matlab -某些列的嵌套循环

Matlab -某些列的嵌套循环
EN

Stack Overflow用户
提问于 2014-11-11 23:12:47
回答 2查看 380关注 0票数 0

我有一个大小为M的dataset数组500x5,有任何方法可以使用嵌套的for循环来遍历数组的特定列吗?如果是这样的话,我该怎么做呢?我希望循环中的if语句类似于:

代码语言:javascript
运行
复制
if age <= 80
  age = 1
else 
  age = 2
end  

我将把什么作为for循环?是否最好将变量初始化为young =1; old = 2;,然后在if语句中使用age = young而不是age = 1?我试图将数据离散到12中,1是年轻的,2是老的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-12 00:16:19

这可以通过多种方式完成。如您所说,您可以使用嵌套的for循环,也可以像Rodrigo建议的那样使用条件赋值。

首先,这是您的数据:

代码语言:javascript
运行
复制
%// your matrix
M = rand(500,5)*100;

您可能想知道循环的行数和列数.

代码语言:javascript
运行
复制
%// get the size for the loops
[num_rows,num_columns] = size(M);

为了简单地遍历一列,以下内容应该可以工作:

代码语言:javascript
运行
复制
%// 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‘的变量,它只存储循环中的最后一个值。

以下内容应该允许您保存各个列的所有结果:

代码语言:javascript
运行
复制
%// 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循环:

代码语言:javascript
运行
复制
%// 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的条件赋值技巧。下面将产生与最后一个代码片段相同的结果:

代码语言:javascript
运行
复制
%// now without loops
age = zeros(500,5);
age(M <= 80) = 1;
age(M > 80) = 2;

(请注意,我在评论中使用了%和// .您可以忽略//,因为我只是添加了它,这样Stack Exchange才能识别我的注释)

要回答后续的问题,没有必要添加关于young = 1old = 2的内容。但是,它是首选的,因为它允许您删除幻数

编辑以回答后续:

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

  1. 可以在末尾将新数组分配给旧数组的列。
  2. 可以在循环时分配新值。
  3. 您可以使用上面提到的条件替换Rodrigo。

第一个很容易..。使用上面最后两个过程中的一个,然后执行以下操作:

代码语言:javascript
运行
复制
M(:,col_to_replace) = age(:,col_to_replace_with);

或者您可以在一起添加一个新列:

代码语言:javascript
运行
复制
M(:,6) = age(:,col_of_interest);

或者,您只需更改循环,以便将原始值替换为它们的离散值:

代码语言:javascript
运行
复制
%// 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的所有行和列:

代码语言:javascript
运行
复制
M(M <= 80) = 1;
M(M > 80) = 2;

要回答您的具体示例,这将遍历第1列并将结果保存在第3列中:

代码语言:javascript
运行
复制
%// 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
票数 0
EN

Stack Overflow用户

发布于 2014-11-11 23:19:00

试试这个:

代码语言:javascript
运行
复制
m = rand(500,5)*100; //your dataset
m(m(:,ii) <= 80) = 1;
m(m(:,ii) > 80) = 2;

其中ii是您想要更改的列。例如,ii =3

代码语言:javascript
运行
复制
m(m(:,3) <= 80) = 1;
m(m(:,3) > 80) = 2;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26876382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档