【问题标题】:Set variables of certain value in a matrix or array to random values in matlab将矩阵或数组中特定值的变量设置为matlab中的随机值
【发布时间】:2017-12-30 23:32:27
【问题描述】:

我有一个矩阵(或此处的数组以便于理解),其中填充了值,例如:

[0 0 1 0 0 0 1 0 0 0 ]

现在我想将每个元素(例如 0)填充为一个随机值,但每个元素都应该不同。

如果我这样做:

replace_val = 0
x = [ 0 0 1 0 0 0 1 0 0 0 ]
x(x == replace_val) = rand

那么所有0都会被替换成相同的数字,例如:

[ 0.8361    0.8361    1.0000    0.8361    0.8361    0.8361    1.0000    0.8361    0.8361    0.8361 ]

现在最直接的方法是创建一个循环遍历向量,并且在满足条件的任何时候,它都会调用 rand 函数,如下所示:

for i=1:length(x)
  if x(i) == replace_val
   x(i) = rand;
  end
end

但是,对于矩阵或非常大的数组,这将非常慢。所以,我想知道是否有任何一种快速、matlabish 的方式来获得所需的输出?

【问题讨论】:

    标签: arrays matlab matrix random


    【解决方案1】:

    这应该可行:

    replace_val = 0
    x = [ 0 0 1 0 0 0 1 0 0 0 ];
    idx = x == replace_val;
    x(idx) = rand(sum(idx(:)),1)
    

    解释:rand 没有输入参数将创建一个标量随机值。您需要指定尺寸以获得不同的随机值。为了匹配要替换的值的数量,sumup idx 变量。

    希望这会有所帮助!

    【讨论】:

    • 正如我在下面@Adrian 的回答中指出的,如果您使用sum(idx(:))nnz(idx) 而不是sum(idx),这将适用于具有任意维数的矩阵,这将返回一个向量/矩阵任何不是一维的idx
    【解决方案2】:

    Souty 的答案的一个小变化,它适用于给定的样本。我对 sum 的使用感到不舒服,认为如果在多维矩阵上使用它可能会导致问题。在 rand 矩阵上使用逻辑索引可以将其用于具有多个维度的矩阵。对我来说,这更像是一种“matlabish”方式。

    % define replacement value
    replace_val = 0;
    
    % sample data
    x=eye(5);
    
    % create rand matrix same size as sample data
    y = rand(size(x));
    
    % get indices where replacement data found
    idx = x == replace_val;
    
    % use logical indexing to replace values with those from the rand array
    x(idx)=y(idx);
    

    【讨论】:

    • 虽然sum(idx) 可能会导致多维问题是正确的,但@Scouty 的方法可以通过简单地使用sum(idx(:))nnz(idx) 来完全验证。通过创建y 一个相同大小的逻辑数组,与仅后者相比,您正在使用更多的内存(尤其是对于大型矩阵)......但是嘿不止一种方法来皮肤猫
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 2013-10-21
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多