【问题标题】:Setting a specified number of rows in each column and block of elements to zero将每列和元素块中的指定行数设置为零
【发布时间】:2014-05-21 16:11:21
【问题描述】:

是否有任何简单的方法可以将第 n 列中的指定行数 k 设置为零?这是一个很难解释的问题,所以我想最好看一下这个例子。 假设我有:

A =

 1     2     3
 4     5     6
 7     8     9
10    11    12
13    14    15
16    17    18

我希望设置行,像这样:[row1 col1] = 0; [row2 col1] = 0,然后是[row3 col2]= 0; row4 col2]= 0等等,所以我的输出是:

k = 2
B =

 0     2     3
 0     5     6
 7     0     9
10     0    12
13    14     0
16    17     0

您对如何使用for 循环解决此问题有任何建议/解决方案,或者有其他方法吗?

以及如何将此解决方案进一步扩展到以下内容: 一个=

  1     2     3     1    2     3
  4     5     6     4    5     6
  7     8     9     7    8     9
 10    11    12    10    11    12
 13    14    15    13    14    15
 16    17    18    16    17    18

B =

 0     0     3     1    2     3
 0     0     6     4    5     6
 7     8     0     0    8     9
10    11     0     0    3     1
13    14    15    13    0     0
16    17    18    16    0     0

【问题讨论】:

    标签: matlab for-loop matrix


    【解决方案1】:

    一种方法 -

    k = 2;
    
    row1 = 1:size(A,1)
    col1 = ceil([1:size(A,1)]./k)
    A(sub2ind(size(A),row1,col1))=0
    

    对于已编辑的问题,请像这样使用kron -

    k = 2;
    
    a1 = eye(size(A)./k);
    b1 = ones(k,k);
    A(logical(kron(a1,b1)))=0
    

    【讨论】:

    • @rayryeng 确实非常相似!
    • @Divakar 这对我来说非常有效,我添加了另一个关于它的扩展的问题。
    【解决方案2】:

    这不是问题。我们可以根据k 的值准确地确定您想要将哪些行和列设置为0,然后使用sub2ind 获取单个索引以访问您的矩阵。这将采用列主要格式。然后您可以使用它并将所有值设置为零。这是一个例子。在我们这样做之前,我们需要先知道矩阵的widthheight

    rows = [row1 row2 row3];
    cols = [col1 col2 col3];
    
    %// Get column major indices
    ind = sub2ind([height width], rows, cols);
    
    %// Set the values in this matrix to 0.
    B(ind) = 0;
    

    现在以您的示例为例,我们需要访问所有行。但是,对于列,我们需要访问每列中的k 元素并确保它们不重叠。因此,我们可以这样做:

    k = 2;
    B = reshape(1:18, 6, 3).';
    rows = 1 : 6;
    cols = ceil(rows / k);
    ind = sub2ind([rows cols], rows, cols);
    B(ind) = 0;
    

    你会因此得到:

    B =
    
     0     2     3
     0     5     6
     7     0     9
    10     0    12
    13    14     0
    16    17     0
    

    【讨论】:

      【解决方案3】:

      以下代码可在 matlab 中执行,并且可以执行您想要的操作:

      % Create A-matrix
      A = reshape(1:18,6,3)
      % Set specified datapoints to zero
      A([1,2],[1,1]) = 0
      

      或者,您可以单独设置每个元素

      A(1,1) = 0
      A(1,2) = 0
      

      最一般的方式,用kn

      A([1:k],n) = 0
      

      【讨论】:

        【解决方案4】:

        第一个问题:

        A(mod(0:numel(A)-1, size(A,1)+k) < k) = 0;
        

        对于第二个问题,包括第一个问题作为特例:

        c = repmat({ones(k,size(B,2)/size(B,1)*k)}, size(B,1)/k, 1);
        B = B.*~blkdiag(c{:})
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-07-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-17
          • 2011-04-17
          • 1970-01-01
          相关资源
          最近更新 更多