【问题标题】:For loop with if and elseif statements带有 if 和 elseif 语句的 For 循环
【发布时间】:2018-02-19 15:08:32
【问题描述】:

我有一个简单的问题,我正在尝试替换 1x60000 数组中的值。

这是我的代码,其中Z 是 1x60000 数组:

for i = 1:length(Z)
    if Z(i) == 140
       Z(i) = 1;
    elseif Z(i) == 83
        Z(i) = 2;
    elseif Z(i) == 52
        Z(i) = 3;
    elseif Z(i) == 36
        Z(i) = 4;
    elseif Z(i) == 28
        Z(i) = 5;
    elseif Z(i) == 23
        Z(i) = 6;
    elseif Z(i) == 125
        Z(i) = -1;
    else
       Z = Z(i);
    end
end

数组中的最大值是 140。但是,当我运行代码时,我收到此错误:

索引超出矩阵维度。

任何帮助将不胜感激。

【问题讨论】:

  • 这行肯定会产生错误 Z = Z(i);因为您在左侧没有任何索引
  • ^ ??????̶????̶????̶??????̶????̶????̶????̶????̶当然.如果您想在不满足任何条件的情况下保持值不变,只需删除 else 部分。如果您要替换的值与您要替换的值不同,您可以摆脱循环和 if 条件:Z(Z== 140)=1;Z(Z== 83)=2 等等...
  • @SardarUsama 或 use ismember 你甚至不需要所有单独的索引条件;)

标签: matlab loops for-loop if-statement


【解决方案1】:

您的问题是Z = Z(i) 行,您将单个值分配给数组,然后尝试在下一个循环中索引该单个值。如果您想保持Z(i) 不变,请不要使用else 条件。

使用一些逻辑索引和ismember

% Row 1 values to be replaced in Z by row 2 values
replacements = [140, 83, 52, 36, 28, 23, 125; 
                  1,  2,  3,  4,  5,  6,  -1];
% Get the indices where Z is one of the values to be changed
[~, idx] = ismember(Z, replacements(1,:));
% Use indexing to replace all the values at once
Z(idx~=0) = replacements(2, idx(idx~=0));

【讨论】:

    【解决方案2】:

    肯定会产生错误的那一行

    Z = Z(i);
    

    因为您在左侧没有任何索引。

    【讨论】:

    • 不确定这是否完全解释了问题...Z=Z(i) 是一个完全有效的声明,它不是代码的本意,但它不会导致错误。当您尝试再次访问 Z(i)(下一个循环)时出现错误,而 Z 不是预期的(现在是标量)
    • 这就是为什么如果您删除该行,或者使用索引正确分配它,错误就会消失,因为下一个循环交互将是正确的
    • 是的,同意,我只是在澄清为什么该行会导致错误:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多