【问题标题】:How to change the value of a random subset of elements in a matrix without using a loop?如何在不使用循环的情况下更改矩阵中元素的随机子集的值?
【发布时间】:2015-05-19 01:32:58
【问题描述】:

我目前正在尝试在一个非常大的矩阵(大约 400x300 个元素)中选择一个 0 的子集并将它们的值更改为 1。我能够做到这一点,但它需要使用一个循环来选择每个实例randperm 向量中的下一个值。也就是说,矩阵中 50% 的 0 是随机选择的,一次一个,然后变成 1:

z=1;
for z=1:(.5*numberofzeroes)
    A(zeroposition(rpnumberofzeroes(z),1),zeroposition(rpnumberofzeroes(z),2))=1;

    z=z+1;
end

其中 'A' 是矩阵,'zeroposition' 是一个 2 列宽的矩阵,其中 0 的位置在矩阵中(如果你喜欢,也可以是“坐标”),而 'rpnumberofzeros' 是一个 randperm 向量1 到矩阵中零的数量。

例如,对于 z=20,代码可能是这样的:

A(3557,2684)=1;

...所以出现在 A 中这个位置的 0 现在将是 1。

它执行这个循环数千次,因为 .5*numberofzeroes 是一个非常大的数字。这不可避免地需要很长时间,所以我的问题是可以在不使用循环的情况下完成吗?或者至少,以某种方式占用更少的处理资源/时间?

正如我所说,唯一需要做的就是完全随机选择 50%(或任何比例)的 0 更改为 1。

提前感谢您的帮助,如果我能解决任何问题,请告诉我!我是新来的,所以如果我做了任何失礼,请提前道歉。

【问题讨论】:

    标签: matlab matrix


    【解决方案1】:

    这很容易。我想把你介绍给我的朋友sub2indsub2ind 允许您获取矩阵的行和列坐标并将它们转换为线性列主索引,以便您可以在一次调用中同时访问矩阵中的多个值。因此,您想要的等效代码是:

    %// First access the values in rpnumberofzeroes
    vals = rpnumberofzeroes(1:0.5*numberofzeroes, :);
    
    %// Now, use the columns of these to determine which rows and columns we want
    %// to access A
    rows = zeroposition(vals(:,1), 1);
    cols = zeroposition(vals(:,2), 2);
    
    %// Get linear indices via sub2ind
    ind1 = sub2ind(size(A), rows, cols);
    
    %// Now set these locations to 1
    A(ind1) = 1;
    

    第一条语句获取存储在rpnumberofzeroes 中的坐标矩阵的前半部分。第一列是行坐标,第二列是列坐标。请注意,在您的代码中,您希望使用zeroposition 中的值来访问A 中的位置。因此,从rpnumberofzeroes 中提取相应的行和列,以从zeroposition 中找出正确的行和列。完成后,我们希望使用来自zeroposition 的这些新行和列并索引到Asub2ind 需要三个输入 - 您尝试访问的矩阵的大小......所以在我们的例子中,这是 A,行坐标和列坐标。输出是为每对行和列计算的一组列主索引。

    最后一块拼图是使用这些索引到 A 并将位置设置为 1。

    【讨论】:

      【解决方案2】:

      这也可以通过线性索引来实现:

      % find linear position of all zeros in matrix 
      ix=find(abs(A)<eps);  
      % set one half of those, selected at random, to one.
      A(ix(randperm(round(numel(ix)*.5)))=1;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-13
        • 1970-01-01
        • 2011-12-19
        相关资源
        最近更新 更多