【问题标题】:How to set in Matlab the min value of each row (or column) in array?如何在Matlab中设置数组中每一行(或列)的最小值?
【发布时间】:2017-03-22 14:41:57
【问题描述】:

我在matlab中有一个数组,例如

a=rand([3,3])
a =

0.8308    0.9172    0.7537
0.5853    0.2858    0.3804
0.5497    0.7572    0.5678

现在,我想将每行的最小值设置为 0。结果应该是:

a =

0.8308    0.9172    0
0.5853    0         0.3804
0         0.7572    0.5678

我不知道如何为此使用[Y,I]=min(a,[],2) 函数。谢谢。

【问题讨论】:

    标签: matlab min


    【解决方案1】:

    如您所说,您可以使用获取每行最小值的列索引

    [~, col] = min(a, [], 2);
    

    现在您可以使用sub2ind 将条目设置为零:

    a( sub2ind(size(a), 1:size(a,1), col.') ) = 0;
    

    你可以在ideone上玩它。

    【讨论】:

    • 错误:不平衡或意外的括号或括号。我清除了最后一个括号,但仍然不起作用..
    • 使用 sub2ind 时出错 下标向量的大小必须相同。还是不行。
    • @IvoVertat 已修复。
    • 优秀。做得好。谢谢。
    • @IvoVertat 如果此解决方案对您有用,请考虑通过单击其旁边的“v”图标来“接受”它。谢谢!
    【解决方案2】:

    一种低效的方法是遍历每一行并使用 find 命令查找特定行中的所有最小值。

    n = 10;
    A = rand(n,n);    
    for ii = 1:n
    ind = find(A(ii,:) == min(A(ii,:)));
    A(ii,ind) = 0;
    end
    

    如果有多个最小值,这会将所有这些设置为零。

    希望这会有所帮助。

    【讨论】:

    • 不需要循环。最好使用逻辑索引而不是find
    【解决方案3】:

    如果您担心同一行中有多个最小值:

    row_min = min(a, [], 2);
    a( bsxfun(@eq, row_min, a) ) = 0;
    

    不需要循环(与Matt T's 答案相反)。

    【讨论】:

    • 对于多维数组,它运行良好且易于扩展。谢谢
    猜你喜欢
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 2020-05-25
    • 2017-12-07
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多